【发布时间】:2020-09-16 14:01:36
【问题描述】:
假设我在 C++ 中有以下文件:
// bar.hpp
int foo();
int bar();
// bar.cpp
#include "bar.hpp"
int bar() { return 3; }
// main.cpp
#include "bar.hpp"
int main() { return bar(); }
请注意,foo() 已声明(在 main.cpp 和 bar.cpp 翻译单元中)但从未在任何地方定义。另一方面,它也没有在任何地方使用。这合法吗?我怀疑这在实践中很好,因为编译单元都没有引用foo 符号,所以链接器永远不会尝试找到它。但我很好奇 C++ 标准是否保证这是可以的。 (我什至不确定标准是否谈到了链接。)
【问题讨论】:
-
未定义,但已声明的函数用于元编程。
-
@L.ScottJohnson 谢谢,这肯定是相关的,但它并不能完全回答问题,当然不是从语言律师的角度来看。
-
FWIW, here 您可以看到一个实际使用已声明但未定义的函数来提取泛型编程类型的示例。
-
@NathanOliver 很好的例子,谢谢
标签: c++ linker language-lawyer one-definition-rule