경고 c4099 : 'struct'(MS VS 2K8)를 사용하여 본 '클래스'를 사용하여 처음 보이는 유형 이름

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

  •  19-08-2019
  •  | 
  •  

문제

이 경고가 걱정할 것이 있습니까? 나는 그것이 불규칙한 행동을 유발할 수 있다는 것을 읽었습니까?

제가 컴파일하려는 예입니다. 누군가 저에게 저자가 왜 대상을 클래스로 선언하는지 설명 할 수 있지만 typedef는 구조에 대한 이유를 설명 할 수 있습니까? 수업이 그렇게하는 것이 완벽하게 정상입니까? 현물 상환 지불?

감사.

도움이 되었습니까?

해결책

이 경고는 다른 하나와 모순되는 한 유형의 선언이있을 때 나타납니다 (하나는 "클래스"라고 말하고 다른 하나는 "struct"라고 말함). 하나의 정의 규칙이 주어지면, 최대 하나를 제외한 모든 선언은 선언이어야합니다. 경고는 일반적으로 유형의 전방 선언이 잘못되었으며 일반적으로 간단한 오타이며 고정되어야 함을 나타냅니다. 이 경우 부작용은 없어야하지만 실제로 고쳐야합니다.

그러나 유형의 이름 충돌이있는 경우 매우 불쾌한 일이있을 수 있습니다 (아마도 "네임 스페이스 사용"조항 또는 글로벌 네임 스페이스 오염으로 인해 발생합니다). 이러한 경고는 두 개의 다른 라이브러리에서 헤더를 혼합하고 있으며 유형 이름에는 충돌이 있음을 나타냅니다. 이러한 조건 하에서 편집 된 코드는 예상치 못한 일을 할 수 있습니다.

내 조언 - 경고가 나타난 이유를 이해하고 수정하십시오. 경고가 제 3 자 제품에있는 경우 고치라고 주장합니다.

다른 팁

MSALTERS의 의견을 가져 오기 위해 이것 위에 최상위로 게시하십시오. VC가 이름을 망울 때 '클래스'또는 'struct'키워드를 사용하여 VC의 결과로 링커 오류를 찾기가 어려웠습니다.

문제가 될 것으로 기대하지 않으면 몇 시간 동안 머리를 긁을 수 있습니다!

블로그 게시 에서이 경고에 대해 자세히 논의합니다. "C4099는 정말 어리석은가요? ". 내 결론은 그것이 가장 잘 꺼진다는 것입니다. :-) 글쎄, 적어도 나를 위해.

Richard Corden은 정확합니다. MS 가이 경고를하는 이유가 있습니다. MS 컴파일러의 경우, 장식 된 (Mangled) 이름은 다음을 포함합니다. 클래스 키 (struct 또는 class)는 유형을 선언하는 데 사용됩니다. 객체를 인수로 취하거나 잘못된 클래스 키가 표시 될 때 객체가 어딘가에 참조되는 함수가있는 경우 컴파일러 오류가 발생하지 않지만 장식 된 이름이 다르기 때문에 링커가 불만을 제기합니다. 링커 오류는 찾고있는 기호 만 표시되며 클래스 키 불일치를 간과하기 쉽기 때문에 더 자세한 컴파일러 경고는 가치가 있습니다. 물론 두 버전이 동일한 컴파일 장치에 나타나지 않을 수 있으며, 유일한 차이가 기본 멤버 가시성이라고 생각하면 헤드를 잠시 긁을 것입니다.

Mangling의 차이는 C ++ 표준과 충돌하며, 이는 다음과 같은 선언이 있습니다. struct Foo; 그리고 class Foo; 동등하고 동일한 망설을 사용해야합니다.

이것은 나쁜 관행으로 간주되지만, 기본적으로 동일한 데이터 유형이기 때문에 클래스 정의와 구조 선언을 혼합하는 데 아무런 문제가 없어야한다고 생각합니다. 주요 차이점은 구조물 멤버는 기본적으로 공개적으로 개인이지만 비공개 인 클래스 멤버와는 반대로 메모리 레이아웃이 동일하다는 것입니다.

이 경고를 일으킬 수있는 한 가지는 DLL에서 .tlb 파일을 #IMPORT로 시도하는 동시에 프로젝트의 참조와 동일한 DLL을 갖는 것입니다. 프로젝트 내에서 DLL을 참조로 제거하여 문제를 해결했습니다.

C ++에서 클래스와 구조물의 차이는 클래스의 멤버 변수, 멤버 기능 및 기본 클래스가 기본적으로 비공개이고 기본적으로 공개적으로 공개된다는 것입니다. 따라서 수업이 포드라는 사실은 여기서 어떤 차이도하지 않아야합니다.
이 경고는 코드 유지 보수 (정의가 다른 곳에서는 업데이트되었지만 다른 곳이 아닌)에서 나오고 경고가 사라지도록 코드를 수정한다고 생각합니다 (예 : TypEdef에서 클래스를 사용하여).

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