声明但不定义未使用的函数是否合法?
Is it legal to declare but not define a function that is unused?
假设我有以下 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++ 标准是否保证这是可以的。 (我什至不确定标准是否谈论链接。)
是的,这是合法的。函数和变量只有在odr-used时才需要定义。 odr-use 是 使用 它们的精确表达方式,对于函数来说,它的意思是您调用它或获取它的地址。
更准确地说,该函数必须出现在 potentially-evaluated 表达式中,即除了
之外的所有内容
decltype
sizeof
typeid
noexcept
该标准确实没有谈论链接,而是只谈论翻译单元。尽管我们通常只称一个实现为“编译器”,但我们实际上指的是整个工具链,包括链接器。因此,即使未明确提及链接器,也非常隐含。
假设我有以下 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++ 标准是否保证这是可以的。 (我什至不确定标准是否谈论链接。)
是的,这是合法的。函数和变量只有在odr-used时才需要定义。 odr-use 是 使用 它们的精确表达方式,对于函数来说,它的意思是您调用它或获取它的地址。
更准确地说,该函数必须出现在 potentially-evaluated 表达式中,即除了
之外的所有内容decltype
sizeof
typeid
noexcept
该标准确实没有谈论链接,而是只谈论翻译单元。尽管我们通常只称一个实现为“编译器”,但我们实际上指的是整个工具链,包括链接器。因此,即使未明确提及链接器,也非常隐含。