如何在C ++中检测声明但未定义的函数?

时间:2014-04-21 16:56:42

标签: c++ xcode

以下编译,链接和运行就好了(在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()也没有定义?错误实际上会更好。

谢谢!

4 个答案:

答案 0 :(得分:2)

有很好的理由说明为什么它不容易实现。一组头文件可以声明许多函数,其中一些函数由其他库提供。你可能想要#include这样的标题而不使用所有这些函数(例如,如果你只想使用一些#define - d常量)。

或者,拥有一些标头并实现(在您的库中)只有头文件定义的API的一个子集是合法的。

C ++或C头文件还可以定义潜在插件定义的代码接口,用于通常在没有插件的情况下运行的程序。许多接受插件的程序都在其头文件中声明了插件接口。

如果您真的想要进行此类检查,您可能会考虑使用MELT自定义GCC;但是,这样的检查目前无法实现(并且您也需要链接时间优化)。

答案 1 :(得分:-1)

也许尝试调用实现映射中的所有函数,并添加一个try catch,如果它们发生段错误,会发出一些警告。

答案 2 :(得分:-1)

你没有。或者更确切地说,这不是编译器的工作

我想我只是重复评论中的其他内容,但是:

  • 它实际上是一个功能(参见未实现的私有构造函数)
  • 这真的没有用,因为这里的“bug”是在提交代码之前没有进行适当的代码清理,而未实现的未使用的函数真的是你最小的问题然后。那些尚未清理的其他东西怎么样?使用实现和未使用函数的可能性对我来说同样高,并且或多或少都是同样的混乱。

我不会担心这个特定情况,而是检查这是否只是一次性故障,或者您的开发团队是否可以改进某些程序以防止此类事情发生。

答案 3 :(得分:-1)

就C ++等语言而言,检测和报告未定义的函数将会破坏它提供的重要功能之一。虚拟/纯虚函数是C ++实现运行时多态的重要机制之一。

如果您正在开发一个供其客户端使用的库,那么您可能已经声明但未定义的虚函数。您可以为其客户留下定义。在这种情况下,如果编译器要报告这种未定义的函数,那么它将没有用处。