考虑以下源文件1.cpp
#include <iostream>
using namespace std;
struct X
{
X()
{
cout << "1" << endl;
}
};
void bar();
void foo()
{
X x;
}
int main()
{
foo();
bar();
return 0;
}
2.cpp
#include <cstdio>
struct X
{
X()
{
printf("2n");
}
};
void bar()
{
X x;
}
从这些文件编译的程序格式是否正确?它的输出中应该包含什么?
由于违反一个定义规则或输出"12",我预计会出现链接器错误。然而,当使用g++3.4和VC 8.0编译时,它会打印出"11"。
如何解释?
这确实违反了ODR(3.2)-特别是一个内联函数可以有多个定义,但这些定义必须相同(3.2/5)-并导致未定义的行为,因此任何事情都可能发生,编译器/链接器不需要进行诊断。您看到这种行为的最可能原因是函数调用是内联的,并且不参与链接,因此不会发出链接错误。
如果内联函数(如类构造函数)在不同的转换单元中有不同的定义,这是未定义的行为(无需诊断)。