2014-11-27 3 views
1

(1 예처럼 명시 적 definitios없이 정의되어 보이는) :C 문제는 내가 구조체 만든

typedef struct 
{ 
    short s; 
    int i; 

    struct Ss 
    { 
     short s; 
    }; 
} S; 

나는 오류 (VS2012)가 : 내가 볼

error C2020: 's' : 'struct' member redefinition 

을 이름 "s"가 사용되지만 중첩 된 이름의 struct에 있으므로 문제가되지 않아야합니다. C11에서 intonymized 구조체와 공용체가 있지만 제 경우에는 익명이 아니며 C11을 지원하지 않는 VS2012가 있다는 것을 알고 있습니다.

또 다른 흥미로운 예는 다음과 같습니다 VS2008를 sizeof (A)에 24 =하지만 난 단지 1 개 필드가 정의되어 있습니다

typedef struct 
{ 
    short s; 
    union U 
    { 
     int uu; 
    }; 

    struct S 
    { 
     short ss; 
    }; 

    union 
    { 
     int i; 
     double d; 
    }; 

} A; 

흥미로운 생각이 있다는 것입니다. 그리고 코드를 사용하는 경우 :

A a = {1, 2, 3, 4}; 
printf("A.s=%d A.uu=%d A.ss=%d A.i=%d \n", a.s, a.uu, a.ss, a.i); 

출력입니다 :

A.s=1 A.uu=2 A.ss=3 A.i=4 

그래서 내 질문은 : 그런 이유, 그것은 올바른 행동인가?

답변

4

부분은 이름을 선언하지 않았거나 익명의 멤버가 아니기 때문에 첫 번째 예는 C가 아닙니다. VS에서 허용하는 경우 확장 프로그램이어야합니다.

typedef struct 
{ 
    short s; 
    int i; 

    struct Ss 
    { 
     short s; 
    } m ; 
} S; 

또는 C11이있는 경우 : 그것은이어야한다

typedef struct 
{ 
    short s; 
    int i; 

    struct //anonymous structure 
    { 
     short s2 ; 
    } ; 
} S; 

하는 경우에는 마지막 멤버의 이름은 달라야합니다. C11에서 익명의 구조가 무엇인지

그냥 나머지 :

6.7.2.1 P13

유형이 지정 와 구조 지정자 아니 태그가 익명을 호출되지 않는 익명의 회원 구조; 형식 지정자가 태그가없는 공용어 지정자 인 익명 멤버는 익명 공용체라고합니다. 익명 구조 또는 조합의 멤버 인 은 포함하는 구조체 또는 공용체의 멤버로 간주됩니다. 포함하는 구조체 또는 공용체가 익명 인 경우이 작업은 재귀 적으로 에 적용됩니다.

struct //note the missing tag 
{ 
    int name ; 
} ; 
이 익명의 구조를 만드는