2011-01-05 2 views
0

실수로 링크 오류가 발생했습니다. 아,링크 타임에 멤버 함수를 찾을 때 링커에서 액세스 수준을 비교합니까?

//a.h 
class A 
{ 
int a; 
#ifdef AAA 
public: 
#endif 
int getA(); 
} 

//a.cpp 
include "a.h" 
int A::getA() 
{ 
return a; 
} 

//test.cpp 
#include "a.h" 
int main() 
{ 
A a; 
a.getA(); 
return 0; 
} 

이 세 파일이 개 프로젝트에 있고 프로젝트 A의 a.cpp가있는 AAA 매크로 프로젝트 테스트에서의 Test.cpp에 정의되지 않은 : 프로그램은 다음과 같이 다소이다 which AAA 매크로가 정의됩니다. 그리고 프로젝트 테스트는 프로젝트 A에서 denfts합니다. 그런 다음 링크 오류가 발생합니다. 나는 Visual Studio 2008에서이 테스트를 수행했습니다.

제 질문은 이것입니다. "연결시 멤버 함수 심볼을 찾을 때 링크가 액세스 수준을 비교합니까?" 이전의 의견으로는 액세스 수준이 컴파일에만 적용됩니다. 그러나이 경우 액세스 수준이 링크 시간에 영향을 미칠 수 있습니다.

답변

0

링커는 무죄이다. C++ 컴파일러 mangel 액세스 수정 자, 오버로드 (반환 및 인수 유형), 템플릿 (확실하지 않음) 등으로 이름을 통합하고 링커가 유효한 식별자로 간주하는 모든 것을 형성하는 명확한 무언가를 생성하는 최종본 (C가 맹 글링을 필요로하지 않으므로 적어도 [a-zA-Z_][a-zA-Z0-9_]*). 링커는 그 맹 글링 된 이름만을보고, "이 함수를 호출하지만 그것은 어디에도 정의되어 있지 않습니다."를 제외하고는 아무 것도보고 할 수 없습니다. public A::getA() 다른 이름은 private A::getA()입니다.

해결책? 그런 배트맨 물건에는 전처리기를 사용하지 마십시오. 또는 VS 개발자가 이러한 오류 메시지를 가로 채서보다 의미있는 것으로 변환하도록 설득하십시오. (과거에는 없었기 때문에 정상적인 코드에서는이 문제가 거의 발생하지 않을 가능성이 거의 없습니다.)

관련 문제