【问题标题】:Is it legal to declare but not define a function that is unused?声明但不定义未使用的函数是否合法?
【发布时间】: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.cppbar.cpp 翻译单元中)但从未在任何地方定义。另一方面,它也没有在任何地方使用。这合法吗?我怀疑这在实践中很好,因为编译单元都没有引用foo 符号,所以链接器永远不会尝试找到它。但我很好奇 C++ 标准是否保证这是可以的。 (我什至不确定标准是否谈到了链接。)

【问题讨论】:

  • 未定义,但已声明的函数用于元编程。
  • @L.ScottJohnson 谢谢,这肯定是相关的,但它并不能完全回答问题,当然不是从语言律师的角度来看。
  • FWIW, here 您可以看到一个实际使用已声明但未定义的函数来提取泛型编程类型的示例。
  • @NathanOliver 很好的例子,谢谢

标签: c++ linker language-lawyer one-definition-rule


【解决方案1】:

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

更准确地说,函数必须出现在一个潜在求值的表达式中,即除了 inside 之外的所有内容

decltype
sizeof
typeid
noexcept

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 2016-06-13
    • 2017-06-08
    • 1970-01-01
    相关资源
    最近更新 更多