【发布时间】:2021-03-04 17:47:11
【问题描述】:
我的问题类似于this one,但略有不同。
假设我有两个翻译单元exec.cpp和lib.cpp,如下:
// exec.cpp
int foo();
int main() {
return foo();
}
和
// lib.cpp
auto foo() {
return 42;
}
将它们编译并链接在一起是否合法?还是不正确的 NDR?
注意:g++ 和 clang 都使用命令 <compiler> exec.cpp lib.cpp -o program 生成预期的可执行文件(即返回 42)
注意:可以说这是一种不好的做法(因为如果实现发生变化,返回类型可能会改变,并破坏代码)。但我还是想知道答案。
【问题讨论】:
-
即使它不是非法的,从长远来看也会导致难以调试的微妙问题,从而从长远来看会浪费您的时间。为什么要冒险。
-
不要在 cmets 中回答,人们
-
@LanguageLawyer 不是这样。只有一个定义。
-
但是在另一个翻译单元中的 delcaring 是否包含“重新声明”? 不是你的情况,至少根据the current wording。
-
我希望eel.is/c++draft/basic.link#11 成为这里的控制规则,但我认为在这种情况下如何解释“相同类型”并不是特别清楚。
标签: c++ c++14 language-lawyer auto