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



假设我在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.cppbar.cpp翻译单元为单位(,但从未在任何地方定义。另一方面,它也没有在任何地方使用。这合法吗?我怀疑这在实践中是好的,因为两个编译单元都没有引用foo符号,所以链接器永远不会试图找到它。但我很好奇C++标准是否保证了这一点。(我甚至不确定标准是否谈到了链接。(

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

更准确地说,函数必须出现在一个潜在的评估表达式中,这是中的所有内容

decltype
sizeof
typeid
noexcept

该标准实际上没有谈到链接,而是只谈到翻译单位。尽管我们通常只是将实现称为";编译器";,我们真正指的是整个工具链,包括链接器。因此,尽管链接器没有明确提及,但它在很大程度上是隐含的。

最新更新