gpt4 book ai didi

c++ - 同一类的多个定义

转载 作者:行者123 更新时间:2023-11-30 03:12:38 25 4
gpt4 key购买 nike

使用 MSVC++ 2005 时,我注意到如果多次定义同一个类,程序仍然可以正常链接,即使是在最高警告级别。我觉得奇怪,这怎么不是错误?

模块_a.cpp:

#include <iostream>
struct Foo {
const char * Bar() { return "MODULE_A"; }
};
void TestA() { std::cout << "TestA: " << Foo().Bar() << std::endl; }

模块_b.cpp:

#include <iostream>
struct Foo {
const char * Bar() { return "MODULE_B"; }
};
void TestB() { std::cout << "TestB: " << Foo().Bar() << std::endl; }

主要.cpp:

void TestA();
void TestB();
int main() {
TestA();
TestB();
}

输出是:

TestA: MODULE_A
TestB: MODULE_A

最佳答案

这是一个错误 - 代码违反了 C++ 单一定义规则。如果你这样做,标准会说你会得到未定义的行为。

代码链接,因为如果你有:

struct Foo {
const char * Bar() { return "MODULE_B"; }
};

在这两个模块中都不会违反 ODR - 毕竟,这基本上就是#including header 所做的。违规是因为您的定义不同(另一个包含字符串“MODULE_A”),但链接器(仅查看类/函数名称)无法检测到这一点。

关于c++ - 同一类的多个定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/696985/

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