考虑以下源文件 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("2\n");
}
};
void bar()
{
X x;
}
程序是否从这些文件编译良好?它的输出应该是什么?
由于违反了一个定义规则或输出“1 2”,我预计会发生链接器错误。但是,当使用g ++ 3.4和VC 8.0编译时,它打印出“1 1” 如何解释这个?
答案 0 :(得分:2)
这确实违反了ODR(3.2) - 特别是你可以拥有多个内联函数的定义,但这些定义必须相同(3.2 / 5) - 并导致未定义的行为,因此任何事情都可能发生并且编译器/ linker不需要/ linker来诊断它。您看到该行为的最可能原因是内联函数调用并且不参与链接,因此不会发出链接错误。
答案 1 :(得分:1)
如果内联函数(例如类构造函数)在不同的转换单元中具有不同的定义,则它是未定义的行为(没有必需的诊断)。