内联构造函数和一个定义规则

时间:2012-02-22 06:15:16

标签: c++ one-definition-rule

考虑以下源文件 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” 如何解释这个?

2 个答案:

答案 0 :(得分:2)

这确实违反了ODR(3.2) - 特别是你可以拥有多个内联函数的定义,但这些定义必须相同(3.2 / 5) - 并导致未定义的行为,因此任何事情都可能发生并且编译器/ linker不需要/ linker来诊断它。您看到该行为的最可能原因是内联函数调用并且不参与链接,因此不会发出链接错误。

答案 1 :(得分:1)

如果内联函数(例如类构造函数)在不同的转换单元中具有不同的定义,则它是未定义的行为(没有必需的诊断)。