以下编译,链接和运行就好了(在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()也没有定义?错误实际上会更好。
谢谢!
答案 0 :(得分:2)
有很好的理由说明为什么它不容易实现。一组头文件可以声明许多函数,其中一些函数由其他库提供。你可能想要#include
这样的标题而不使用所有这些函数(例如,如果你只想使用一些#define
- d常量)。
或者,拥有一些标头并实现(在您的库中)只有头文件定义的API的一个子集是合法的。
C ++或C头文件还可以定义潜在插件定义的代码接口,用于通常在没有插件的情况下运行的程序。许多接受插件的程序都在其头文件中声明了插件接口。
如果您真的想要进行此类检查,您可能会考虑使用MELT自定义GCC;但是,这样的检查目前无法实现(并且您也需要链接时间优化)。
答案 1 :(得分:-1)
也许尝试调用实现映射中的所有函数,并添加一个try catch,如果它们发生段错误,会发出一些警告。
答案 2 :(得分:-1)
你没有。或者更确切地说,这不是编译器的工作
我想我只是重复评论中的其他内容,但是:
我不会担心这个特定情况,而是检查这是否只是一次性故障,或者您的开发团队是否可以改进某些程序以防止此类事情发生。
答案 3 :(得分:-1)
就C ++等语言而言,检测和报告未定义的函数将会破坏它提供的重要功能之一。虚拟/纯虚函数是C ++实现运行时多态的重要机制之一。
如果您正在开发一个供其客户端使用的库,那么您可能已经声明但未定义的虚函数。您可以为其客户留下定义。在这种情况下,如果编译器要报告这种未定义的函数,那么它将没有用处。