假设我有一个设计好的头文件,其中包含一个模板类和两个包含完全相同的模板类实例的源文件以及一个重复函数。这是...模板实例化 - 编译器如何避免重复符号?
做作头(thing.hpp):
#pragma once
template <typename T>
class Thing {
public:
T t;
public:
T& value() {
return t;
}
};
thing.cpp:
#include <thing.hpp>
template class Thing<int>;
int MeaningOfLife() {
return 42;
}
thingy.cpp:(完全一样thing.cpp)
编译和链接后(在OS X上使用clang),似乎只有MeaningOfLife
被视为重复符号,但模板实例化的符号(它只是Thing::value()
)不是。在仔细检查拆卸后,似乎在Thing::value()
的符号上放置了组装指令。
问题0:暗示此指令正在做一些事情来防止符号被多次定义,但是它究竟在做什么?
问题1:其他编译器可能在其他地方(例如,Linux,Windows等)如何做到这一点?
问题2:如果我反复地改变了其中一个重复模板实例的汇编代码会怎么样?也就是说,相同的符号,不同的功能体。智能编译器会检测出差异吗?
我以前见过这个,但是这看起来像是OS X的特定情况。我想知道其他系统可以做什么。 –
@MonatheMonad其他系统会做类似的事情。语言规范允许多种模板类型的定义。它们都应该匹配,但是如果它们不是编译器(链接器)将首先发现并且不需要发布诊断。 – 1201ProgramAlarm