不同翻译单元中的多个定义

时间:2013-05-04 16:50:10

标签: c++ visual-studio-2012

我知道对于一个定义规则我可以​​在多个翻译单元中定义一个类,如果它们具有相同顺序的相同标记,但这个程序对我来说很奇怪

档案 main.cpp

#include "Source.h"

struct mystructure
{
    int field1;
    float field2;
};

int main()
{

    mystructure myvar;
    myvar.field2= 2.0f;

    myCustomFunction(myvar);

    return 0;
}

档案 Source.h

struct mystructure;

void myCustomFunction(mystructure& vv);

文件 Source.cpp

#include "Source.h"

struct mystructure
{
    char otherfield;
    int anotherone;
    bool anotheranotherone;
};

void myCustomFunction(mystructure& vv)
{
    vv.otherfield = 'A';
}

我正在使用MSVC2012,编译器没有抱怨。这是为什么?这是正常的吗?

2 个答案:

答案 0 :(得分:3)

编译器很难抱怨,因为它在同一编译期间从未看到过冲突的声明。但是这段代码不正确,不幸的是编译器没有收到任何错误,标准也没有要求它们。

答案 1 :(得分:2)

它没有抱怨,因为结构名称实际上并不是作为翻译单元的符号导出的。它们仅在编译器中使用。因此,即使您定义了两个具有相同名称的结构,也不会出现链接器错误。

然而,由于结构不匹配,您将得到未定义的行为。