声明但不定义未使用的函数是否合法?

Art*_*cca 3 c++ linker one-definition-rule language-lawyer

假设我在 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(); }
Run Code Online (Sandbox Code Playgroud)

请注意,foo()已声明(在main.cppbar.cpp翻译单元中)但从未在任何地方定义。另一方面,它也没有在任何地方使用。这是合法的吗?我怀疑这在实践中很好,因为编译单元都没有引用foo符号,所以链接器永远不会尝试找到它。但我很好奇 C++ 标准是否保证这没问题。(我什至不确定标准是否讨论了链接。)

Pas*_* By 7

是的,这是合法的。函数和变量只有在odr-used时才需要定义。odr-use 是使用它们的精确方式,对于函数来说,松散意味着您调用它或获取其地址。

更准确地说,该函数必须出现在一个潜在的评估表达式中,除了在

decltype
sizeof
typeid
noexcept
Run Code Online (Sandbox Code Playgroud)

该标准确实没有谈论链接,而只是谈论翻译单元。尽管我们通常只是将一个实现称为“编译器”,但我们实际上指的是整个工具链,包括链接器。因此,即使没有明确提及链接器,它也非常隐含。