Visual c++ 链接器在链接时查找成员函数时会比较访问级别吗?

Visual c++ 链接器在链接时查找成员函数时会比较访问级别吗?,visual-c++,compiler-construction,Visual C++,Compiler Construction,不小心,我遇到了链接错误。 程序有点像这样: //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.h和a.cpp位于未定义AAA宏的项目a中,test.cpp

不小心,我遇到了链接错误。 程序有点像这样:

//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.h和a.cpp位于未定义AAA宏的项目a中,test.cpp位于定义AAA宏的项目测试中。项目测试依赖于项目A。 然后我遇到一个链接错误。我在VisualStudio2008上做了这个测试

所以我的问题是:“当在链接时找到成员函数符号时,链接会比较访问级别吗?” 在我之前的观点中,访问级别只在编译时生效。但在这种情况下,,
似乎访问级别也会影响链接时间。

链接器是无辜的。C++编译器Mangelle名称,并将其作为访问修饰符、重载(即返回和参数类型)、模板(?不太确定)等。在最后,生成一些明确的东西,这些东西也会形成链接器认为有效的标识符(至少
[a-zA-Z][a-zA-Z0-9\]*
,因为C不需要损坏)。链接器只看到那个被破坏的名称,它不能报告任何东西,除了“你调用这个函数,但它没有在任何地方定义”
public A::getA()
另一个名称为
private A::getA()

解决方案是什么?不要用预处理器来处理这些狗屎东西。或者说服VS开发人员截取此类错误消息并将其翻译成更具意义的内容(但由于他们过去没有这样做,而且理智的代码很少遇到此问题,所以不太可能)