【发布时间】:2013-07-14 13:07:48
【问题描述】:
我有如下 2 个文件,它们声明了同名 class C:
// C1.cpp
class C {
public: void foo (int, float);
};
int main () {
C c;
c.foo(1, 2.3);
}
void C::foo (int, float) {}
// C2.cpp
class C {
public:
int i; // <--- extra variable
void foo (int, float); // <--- non static
};
void foo () {
C c;
c.foo(0, 0.0);
c.i = 0;
}
它与g++ C1.cpp C2.cpp 编译得很好!
- 为什么只有名称相同时没有编译器/链接器错误 但尸体不是?
- 为什么
C::foo(..)的单一定义同时适用于static和非静态版本? - 或者如果这只是编译器的另一个未定义行为案例, 我们可以预防吗?
【问题讨论】:
-
我认为这是“UB,不需要诊断”。
-
@downvoter,这个问题还不足以被否决。
-
您需要标准报价吗?它基本上说“一个类可以有多个定义,但它们都需要由相同的标记序列组成”和“定义中的所有名称都需要引用相同的实体”。正如 Kerred 所说,1)和 2)的答案是 UB,不需要诊断。 3) 的答案是,我猜,就是不要这样做。
-
@jrok,我不知道应该是什么答案。如果您觉得有什么可以帮助的,请发布它。这将对我和未来的访客有所帮助。我在 SO 中找不到类似的问题。对 (3) 的回答不能是“不要这样做”,当您有多个人参与庞大的代码库时,在最坏的情况下它必须是“不可能”。
标签: c++ compiler-errors language-lawyer ambiguity multiple-definition-error