gpt4 book ai didi

c++ - 在不同翻译单元中定义的类

转载 作者:行者123 更新时间:2023-11-28 07:55:01 24 4
gpt4 key购买 nike

据我所知,一个类可以在多个翻译单元中定义,只要它们是相同的。考虑到这一点,请考虑以下示例:

 //1.cpp

class Foo{
public:
int i;
};


void FooBar();

void BarFoo(){
Foo f;
}


int main(){
FooBar();
BarFoo();
}

//2.cpp

class Foo{
public:
std::string s;
};

void FooBar(){
Foo f;
}

这会编译并且我不会崩溃。

如果我进行以下更改:

//1.cpp
Foo FooBar();
//2.cpp
Foo FooBar(){
Foo f;
return f;
}

我崩溃了。为什么一个会导致崩溃而另一个不会。另外,我在第一个例子中没有违反 ODR 吗?如果我是,为什么它编译正常?

最佳答案

由于您所述的原因,该程序格式错误。编译器不需要诊断,但我认为讨论格式错误的程序崩溃的原因没有意义。

不过,让我们开始吧:

第一个示例可能不会崩溃,因为 FooBar 的行为不会影响 main 的运行。方法被调用,它做了一些事情,仅此而已。

在第二个示例中,您尝试返回一个 FooFooBar 返回 2.cpp 中定义的 Foo 的版本。 main 出现在 1.cpp 中,因此它需要 1.cpp 中定义的 Foo 版本,这是一个完全不同的版本 - 不同的成员,大小。您很可能会在析构函数上损坏。 (只是猜测)

编辑:这确实打破了一个定义规则:

3.2 一条定义规则[basic.def.odr]

6) There can be more than one definition of a class type [...] in a program provided that each definition appears in a different translation unit, and provided the definitions satisfy the following requirements. [...]

  • each definition of D shall consist of the same sequence of tokens;

[...]

关于c++ - 在不同翻译单元中定义的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12868576/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com