3

考虑以下源文件 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”。
这怎么解释?

4

2 回答 2

2

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

于 2012-02-22T06:18:30.793 回答
1

It is undefined behaviour (with no required diagnostic) if inlined functions (such as your class constructor) have different definitions in different translation units.

于 2012-02-22T06:23:44.230 回答