我在头文件foo
中有一个类foo.h
,根据是否定义了宏来打印不同。
foo.h中
#pragma once
#include <iostream>
class foo
{
public:
void print()
{
#ifdef GOOD
std::cout << "good\n";
#else
std::cout << "bad\n";
#endif
}
};
然后我有两个cpp文件,good.cpp
和bad.cpp
包含foo.h
- 一个定义宏,另一个不定义宏。
good.cpp
#define GOOD
#include "foo.h"
void good()
{
foo f;
f.print();
}
bad.cpp
#include "foo.h"
void bad()
{
foo f;
f.print();
}
最后,在我的主程序中,我有这个
的main.cpp
extern void good();
extern void bad();
int main(int argc, char* argv[])
{
good();
bad();
}
使用VC ++ 2013,打印以下输出
bad
bad
为什么链接器会选择foo
的“错误”版本?有没有办法强制链接器选择特定版本的foo
?
答案 0 :(得分:4)
如果在多个翻译单元中定义了具有外部链接的类,则所有定义必须相同。通过将foo.h
两次包含在具有不同GOOD
值的不同翻译单元中,您已经生成了两个不同的类foo
定义。这是不正确的,不需要诊断,任何事情都可能发生。
你问的问题&#34;哪个&#34;选择类定义是没有意义的,因为一个类没有&#34;物理&#34;存在于翻译产生的目标文件中。相反,包含类定义的每个翻译单元都是在假设该类确实在每个翻译单元中具有该定义的情况下编译的。当翻译单元链接在一起时,如果这个假设结果不正确,可能会发生一些不好的事情。