【发布时间】:2014-04-21 16:56:42
【问题描述】:
以下编译、链接和运行都很好(在 Xcode 5.1 / clang 上):
#include <iostream>
class C { int foo(); };
int main(int argc, const char * argv[])
{
C c;
cout << "Hello world!";
}
但是,C::foo() 没有在任何地方定义,只是声明了。我没有收到任何编译器或链接器警告/错误,显然是因为 C::foo() 从未在任何地方引用。
有什么方法可以发出警告,即在 整个程序 中即使声明了 C::foo() 也不存在定义?错误实际上会更好。
谢谢!
【问题讨论】:
-
也许静态分析工具可以做到这一点,但我不知道。当然,该定义有多种可能的来源,因此存在复杂性。
-
通常的做法是定义(私有)方法而不实现禁止复制(在 C++03 中,直到 = 删除)...
-
如果您不介意使用第三方工具,那么 cppclean 看起来就像您想要的那样。在它检查的事物列表中,它包括
Unnecessary function declarations。 -
这是 "If a tree falls in a forest..." 问题的 C++ 版本。除非使用任何静态分析工具,否则链接器是唯一有兴趣检测这一点的实体。但由于它只对将定义与引用这些定义的事物联系起来感兴趣,因此它对检测它不感兴趣。所以需要有人在森林里。
-
@oxfordatnight 我知道您是对此感兴趣的“实体”。 :-) 我的意思是编译过程中没有人对它感兴趣,所以你需要求助于某种第三方工具。 (这可能不会告诉你任何你不知道的事情;我只是想确保每个人都在同一个页面上。)