【发布时间】:2017-04-22 15:14:37
【问题描述】:
我阅读了Definitions and ODR 页面,还阅读了一些关于 ODR 的相关问题。仍然不明白为什么它很重要。
例如在file1.cpp中:
int val = 1;
在file2.cpp中:
int val = 2;
在 main.cpp 中:
extern int val;
这种情况违反了 ODR。但在实际情况下,有人会这样做吗?我的意思是对具有相同名称的相同类型的变量的定义似乎很自然。即使有人这样做,编译器或链接器也不会同意。我不明白我们为什么要关心 ODR,因为如果我们编写了错误的代码,编译器或链接器就会报错。是否有可能在不被发现的情况下违反 ODR?谁能列出一些我们经常犯的真实案例或错误?
【问题讨论】:
-
编译器可能根本不会给您任何错误。 odr-violation 会导致未定义的行为,因此您的程序可以做任何事情。
-
"这些代码无法编译" - 是的,它们可以。但是,它们不应该是可链接的。
-
@NeilButterworth 在这种情况下可能是正确的,但在某些非常相似的情况下,它甚至可以毫无问题地链接。不要相信链接器会检测所有 ODR 违规。
-
@hvd 这就是为什么我说“不应该”,而不是“不会”。
-
@NeilButterworth 我已经更正了我的描述。感谢您的建议。
标签: c++