화합물 문자로 익명의 노조를 할당하는 것이 가능합니까 (법적)가 가능합니까?

StackOverflow https://stackoverflow.com/questions/1885854

문제

나는 구조물이있다 :

typedef struct _n
{
    int type;
    union {
        char *s;
        int i;
    };
} n;

화합물 문자를 할당하려고 할 때 :

node n1 = {1, 0};
node n2 = {2, "test"};

GCC는 다음과 같은 몇 가지 경고를 제공합니다.

warning: initialization makes pointer from integer without a cast
warning: initialization from incompatible pointer type

글쎄, 컴파일러가 모호한 유형에 값을 할당하는 것에 대해 확신하지 못한다는 것은 분명합니다. 그러나 더 정확하게 지정하려고하더라도 :

node n0 = {type: 1, i: 4};

나는 얻다:

error: unknown field ‘i’ specified in initializer

내가 넣으면 그것을 읽었습니다 (union <union name>) ~ 전에 i: 그러면 작동 할 수 있습니다. 그러나 나는 익명의 노조를 선호합니다. 할 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

익명 노조는 표준 C가 아닙니다. 이들은 컴파일러 확장입니다. 나는 Union에게 이름을주는 것이 좋습니다. 익명의 노조 사용을 고집하면 첫 번째 요소에 대한 이니셜 라이저 만 제공 할 수 있습니다.

node n0 = {1, 0};  // initializes `s' to 0

컴파일 된 경우 -Wall -Wextra -pedantic, GCC는 "이니셜 라이저 주변의 교정기 누락"을 주었다. 이는 유효한 경고입니다. 이니셜 라이저는 실제로 다음과 같이 지정해야합니다.

node n0 = {1, {0}};  // initializes `s' to 0

이제 이것은 "ISO C가 이름없는 스트러크/노조를 지원하지 않는다"는 경고 만 제공합니다.

Union에 이름을 부여하면 C99 기능을 사용할 수 있습니다. 지정된 이니셜 라이더 연합의 특정 구성원을 초기화하려면 :

typedef struct
{
    int type;
    union {
        char *s;
        int i;
    } value;
} node;

node n0 = {1, { .s = "string"; }};
node n1 = {2, { .i = 123; }};

당신은 이름을 가지고 있으려면 노조가 필요합니다. 그렇지 않으면 컴파일러는 내부의 지정된 이니셜 라이저에 대해 불평합니다.

당신이 사용하려는 구문 node n0 = {type: 1, i: 4} 유효하지 않은 구문입니다. 지정된 초기화기를 사용하려고하는 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top