我阅读并重新阅读了C++标准中有关ODR的相关条款,但是这个问题仍然对我开放。该标准规定,内联函数的定义应出现在使用该函数的每个翻译单元中,并且在几乎一页上都有一定意义的意义上,定义应相同。它说 token 序列必须相同。是否包括本地标识符名称?
换句话说以下程序是否违反了ODR? (我尝试使用Visual Studio 2008对其进行自我测试,但收到0错误和0警告。但是我想这并不能证明任何事情,因为然后我将示例更改为两个完全不同的定义,仍然收到0错误和0警告。以MSVC为借口,应注意,对于违反ODR的行为,正式不需要诊断。
//main.cpp
inline int f(int);
int main(){
f(3);
}
int f(int x){
int z = x;
return z*z;
}
//other.cpp
inline int f(int xx){
int zz = xx;
return zz*zz;
}
最佳答案
标识符是一种 token ,每个标识符是一个单独的 token ,因此,是的,您需要具有相同的标识符才能遵守ODR。它可以在检测到此的编译器中有所作为(有人准备用导出的模板为como构建示例吗?它可以检测到某些违反ODR的行为)。
然后,这里的C和C++之间是有区别的。 C一般没有ODR,C99中的内联函数规则(C90中没有内联函数)与C++完全不同。在C99中,您的代码正确。实际上,您可以提供完全不同的定义。结果是在C中(但在C++中不是),如果使用相同的定义并且该定义具有静态成员,则实际上使用该函数的静态变量与TU一样多。
关于c++ - 一个定义规则:对应的实体可以有不同的名称吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4297480/