2010-01-17 4 views
12

나는 내 코드에서이 비슷한이가상 테이블은

ble: 1 
ble: 2 

과에서 컴파일 할 때 그것은 그렇게 GCC (3.4.5 나는 믿는다).

컴파일 및 Visual Studio 2008에서이 작업을 실행하지만,이 제공 :

흥미로운 무엇
ble: 2 
ble: 2 

, 나는 자료에서 파생 된 구조체 이름 (struct s1 : public Base)를 제공하는 경우, 제대로 작동한다는 것입니다.

어떤 동작이 올바른지 알고 싶습니다. VS가 단지 어리 석 었는가, 아니면 표준을 고수하고 있는가? 여기서 중요한 무엇인가를 놓치고 있습니까?

+1

gcc에서 예상대로 작동합니다.무뚝뚝하기는하지만 컴파일하지 않을 것을 기대했습니다. –

+2

* VS 표준 준수 *? 하하하하하. ... – wallyk

+3

안녕하세요, VC++가 훨씬 나아졌습니다. – GManNickG

답변

2

MSVC가 디버깅 기호에서 어떻게 잘못 표시되는지 알 수 있습니다. 익명 구조체에 대한 임시 이름을 각각 Child::<unnamed-type-First>Child::<unnamed-type-Second>으로 생성합니다. 그러나 vtable은 하나 뿐이지 만 이름은 Child::<unnamed-tag>::'vftable'이며 두 생성자 모두 사용합니다. vtable의 다른 이름은 분명히 버그의 일부입니다.

connection.microsoft.com에서 익명 형식과 관련된 여러 가지 버그가보고되었으며 그 중 하나도 "반드시 수정해야"상태가 아닙니다. 네가 발견 한 사람이 아니야, afaict. 어쩌면 해결 방법이 너무 간단 할 수도 있습니다.

7

내부 이름이 동일하기 때문에 첫 번째 익명 클래스의 vtable을 두 번째 vtable로 덮어 쓰거나 무시하기 때문에 VS 2008의 버그 인 것으로 보입니다. (명시 적으로 이름을 지정할 때, vtable의 내부 이름은 더 이상 동일하지 않습니다.)

표준에서 알 수있는 한, 이것은 예상대로 작동해야하고 gcc가 옳습니다.

+0

(+1) 잘 설명되어 있습니다. –

1

이것은 VC 컴파일러에서 알려진 버그이며 VC10에서 수정되었음을 확인할 수 있습니다. 두 개의 익명 클래스가 vtable을 잘못 공유하고 있습니다.

익명 구조체는 이 아니며 C++ 표준의 부분입니다.

편집 : 익명 구조체는 모호한 용어입니다. 그것은 두 가지 의미 할 수있다 :

class outer 
{ 
public: 
    struct { 
     int a; 
     int b; 
    } m_a; // 1 

    struct { 
     int c; 
    };  // 2 

    union { 
     int d; 
     int e; 
    };  // 3 
}; 

1은 여기에 무슨 일이 일어나고 있는지를, 익명 구조체보다 더 좋은 이름은 "익명의 구조체"일 것이다. 구조체 유형 자체에는 이름이 없지만 객체는 (m_a) 않습니다.

2는 익명 구조체라고도하며 합법적 인 C++가 아닙니다. 객체 이름이 없으므로 outer 유형의 객체에서 'c'필드에 직접 액세스 할 수 있습니다. 이 컴파일러는 Visual Studio의 컴파일러 확장 (/ Za 아래에서 오류가 발생 함)으로 인해 컴파일됩니다.

3 대조적으로 익명의 공용체는 합법적 인 C++입니다.

저는 여기에 우리가 # 1을 "익명 구조체"라고 부르고 두뇌의 전선이 # 2와 교차했기 때문에 나는 두 가지를 혼동했습니다.

+0

명명되지 않은 클래스는 표준 C++이며 "unnamed"대신 "anonymous"라고도합니다. –

+0

@ 로저, 내가 말한 것은 정확합니다. ** 익명 ** 구조체 **; 익명 ** 수업 **. 익명 클래스는 C++ 표준의 일부입니다. 익명 구조체는 C이며 C++의 일부가 아닙니다 (VC를 포함하여 광범위하게 지원되는 벤더 확장이지만). –

+0

"구조체는 클래스 키 구조체로 정의 된 클래스입니다."[9/4] ** 구조체는 클래스입니다. ** –