2012-11-05 2 views
2

이것은 고의적 인 예이지만 핵심적인 문제를 나타냅니다. 나는 노동 조합과 기존의 코드베이스에서 같은 중첩 된 구조의 구조를 가지고 :중첩 된 구조체로 구조체를 다시 사용하면 GCC에서 재정의 오류가 발생합니다.

typedef union _MyUnion 
{ 
    unsigned int A; 
    struct _MyNestedStruct 
    { 
    int field 
    } MyNestedStruct; 
} MyUnion; 

typedef struct _MyStruct 
{ 
    struct _MyNestedStruct 
    { 
    int field 
    } MyNestedStruct; 
} MyStruct; 

내가 그린 힐즈 컴파일러 (GHC)에서이 컴파일하는 경우를 다음 어떤이 없습니다 문제. GCC에서 컴파일하면 오류가 발생합니다 : 'struct _MyStruct'의 오류 : 재정의.

우선 중첩 구조로 명명 된 구조로 성공적으로 컴파일 할 수 있었던 이유는 무엇입니까? 나는 GHC가 일부 C++ 규칙으로 컴파일하고 있거나 중첩 된 구조에서 명명 된 구조를 지원한다고 생각합니다.

둘째, 중요한 코드 변경없이 성공적으로 컴파일하려면 어떻게해야합니까? 중첩 된 구조체에서 _MyNestedStruct를 삭제할 수는 있지만 결과는 어떤 것입니까?

+0

어쩌면 구조체를 실제로 재정의하고 있습니다. 왜냐하면 여기서 많은 GCC 배포판을 컴파일 할 수 있기 때문입니다. –

+0

MyNestedStruct를 정의 대신 선언으로 변경하는 이유가 있습니까? 즉, 포함하는 공용체/구조체 외부에 _MyNestedStruct를 정의한 다음 컨테이너 내부에 구조체의 인스턴스를 선언하십시오. – cowboydan

+0

@ FlavioToribio : 아마도 오류가 발생하기 때문에 C++로 컴파일하고있는 것일 수 있습니다. – rodrigo

답변

8

C에는 네임 스페이스 범위가 없습니다. 암시 적 또는 Explict이므로 모든 구조체 이름이 동일한 네임 스페이스를 공유합니다. 따라서 struct _MyNestedStruct은 두 번 정의되며 오류입니다. GCC가 맞습니다. GHC가 아닙니다.

C++의 경우 각 구조체가 다른 네임 스페이스 범위를 작성하므로 이름 충돌이 없으므로 코드가 정확합니다.

내가 생각할 수있는 솔루션 : 구조는 실제로 같은 경우)

로운 한 번 다른 사람의 외부를 정의() 당신은 첫 번째 내부를 가질 수 있지만, 그 이상이 될 것입니다 .

struct _MyNestedStruct 
{ 
    int field 
}; 

typedef union _MyUnion 
{ 
    unsigned int A; 
    struct _MyNestedStruct MyNestedStruct; 
} MyUnion; 

typedef struct _MyStruct 
{ 
    struct _MyNestedStruct MyNestedStruct; 
} MyStruct; 

나) 두 구조의 이름을 다르게 지정하십시오. C에서 이름의 정의가 동일하면 그 이름이 그렇게 중요하지 않습니다.

C) 이름없는 구조를 사용하십시오. 난 당신이 모두이 이름을 사용하지 않을 생각한다 :

typedef union _MyUnion 
{ 
    unsigned int A; 
    struct 
    { 
    int field; 
    } MyNestedStruct; 
} MyUnion; 

typedef struct _MyStruct 
{ 
    struct 
    { 
    int field; 
    } MyNestedStruct; 
} MyStruct; 

BTW, 어떤 이름으로 시작하고 밑줄 플러스 대문자가 구현을 위해 예약되어 있으며 사용자가 정의 할 수없는 것을 기억하십시오.

관련 문제