【发布时间】:2015-11-16 19:44:31
【问题描述】:
我在头文件foo.h 中有一个类foo,它根据是否定义了宏而以不同的方式打印。
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 - 一个定义宏,另一个不定义。
好.cpp
#define GOOD
#include "foo.h"
void good()
{
foo f;
f.print();
}
坏的.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?
【问题讨论】:
-
1) 没有 C++ 链接器。 2) 不要为不相关的语言添加标签。
-
One Definition Rule "其他违规,尤其是跨越翻译单元的违规,不需要诊断。" ¯_(ツ)_/¯
-
链接器有多种定义可供选择。它掷硬币并选择一个。然而,它的随机数生成器在密码学上并不安全。
-
@PeterHuene:第 3.2 节“一个定义规则”第 3 段明确排除了内联函数。由于在类声明中定义的成员函数是隐式内联的,
print()是一个内联函数。那么程序违反了规则的哪一部分? -
@matz 内联函数可以有多个定义(即在多个翻译单元中有一个定义,因为它是内联的),但定义必须相同。这违反了该规则。
标签: c++ visual-studio-2013 linker