2015-01-11 5 views
0

아래 코드는 "initializer 요소가 상수가 아닙니다"또는 gcc 및 clang에서 유사하게 컴파일되지 않습니다.const 포인터 값을 사용하여 const struct를 초기화하는 방법

z를 더 일정하게 만드는 방법이 있습니까? 이미 상수 문자에 대한 정적 상수 포인터입니다.

표준 규격에 위배되거나 표준에 위배 될 수 있습니까?

static const char * const z = "1234"; 
const struct { 
    const char * a; 
} b = {z}; 

내 특정 유스 케이스, 나는 나쁜 구문은이

const char z[5] = n.x; 

같은 것을 별칭을 정의 할 수 있다면 사실 나는 행복 할 것

const struct { 
    char x[5]; 
    char y[5]; 
} n = {"12345","abcde"}; 
static const char * const z = n.x; 
const struct { 
    const char * a; 
} b = {z}; 

에 가까운하지만, ....

+0

예제 코드는 C++에서 작동합니다. C를 조사 ... – bolov

+0

불행히도 C와 C++ 모두에서 작동하는 코드가 필요합니다. C++에서 지원하지 않기 때문에 이미 구조체 초기화라는 이름을 생략해야했습니다. – Martin

+0

http://stackoverflow.com/questions/21592494/initializer-element-is-not-constant-error-for-no-reason-in-linux-gcc-compilin – bolov

답변

0

다음은 특정 사용 사례에서 가장 근접한 예입니다.

#include <stdio.h> 

const struct 
{ 
    char x[6]; 
    char y[6]; 
} 
    n = { "12345", "abcde" }; 

static const char * const z = n.x; 
const struct 
{ 
    const char * const *a; 
} 
    b = { &z }; 

int main(void) 
{ 
    printf("%s\n", *b.a); 
} 

이전에 선언 된 정적 또는 전역 개체의 주소는 항상 컴파일 타임 상수입니다. 따라서 &za에 할당하면 a은 포인터 포인터입니다.

+0

코드에 중간 변수가 누락되어 있습니다. 중간 변수가 없으면 작동합니다.그리고 NUL은 신경 쓰지 않아요. 배열은 부호없는 문자이고 16 진수 값입니다. 스 니펫은 단순화 된 것입니다. – Martin

+0

@ Martin 좋아, 나는 또 다른 기회를 줬다. – user3386109

+0

여전히 좋지 않다. 나는 많은 코드를 변경해야하고, 모든 코드는 추가 참조를해야 할 것이다. 그것은 작동하지만 불행히도 내 문제에 대한 해결책은 아닙니다. – Martin

0

당신은 매크로를 사용할 수 있습니다

struct P { 
    char x[5]; 
    char y[5]; 
}; 

#define X(_n, _z, s1, s2) \ 
    const struct P _n = {s1, s2}; \ 
    static const char _z[] = s1; 

X(n, z, "12345", "abcde") 

const struct 
{ 
    const char * a; 
} b = {z}; 

사전 prcoessor는 다음 만들 것입니다 : 이것은 완벽하게 정상적으로 컴파일

const struct P n = {"12345", "abcde"}; 
static const char z[] = "12345"; 

const struct { 
    const char * a; 
} b = {z}; 

.

+0

내가 피하려고 노력하고있어, 내가 포장 된 구조체 (memcpy 5 번 할 필요가 피하기 위해) 및 데이터를 복제하지 않고 별도로 중복을 제거하는 컴파일러에 의존하지 않고 참조 된 일부 이진 데이터가 필요합니다. – Martin

+0

@Martin 그러면 데이터를 복제하지 않는다면'const char z [5] = n.x;'(질문의 스 니펫에 따라)의 의도는 무엇입니까? – alk

+0

나는 명확하지 않았습니다. C++ 참조, size를 가진 포인터와 같은 것을 원했기 때문에 sizeof (z)는 sizeof (void *) 대신 5를 반환합니다. – Martin

0
const struct { 
    char x[5]; 
    char y[5]; 
} n = {"12345","abcde"}; 
#define z n.x 
const struct { 
    const char * a; 
} b = {z}; 
#include <stdio.h> 
int main(void) 
{ 
    printf("%.5s == %.5s == %.5s\n", b.a, z, n.x); 
} 

#define 모든 명시된 요구 사항을 충족 :

  • 그것은 C 및 C++ 표준 순응이다.
  • 전화를 걸려면 별칭입니다.
  • 일정한 상수입니다.
  • 구조가 n 인 데이터는 중복되지 않습니다.
  • sizeof z은 5입니다.
  • 읽기 쉽고 유지 보수가 용이합니다.
관련 문제