C编程语言中是否有一种方法可以检查头文件中的函数原型是否与编译时的实际函数定义相对应。 例如,如果我创建头文件,然后更改该头文件中描述的某些函数的签名,如果头文件中有错误的原型,我可以检查编译时间吗?在编译之前,这是编译器或其他工具的工作吗? 感谢。
答案 0 :(得分:2)
如果使用两个不同的原型声明相同的函数名,编译器应该捕获它,即:
int foo(int a, int b);
...
int foo(int a, float b) { ... }
当然,如果你实际上重命名了这个函数,那么编译器就无法捕获它,即:
int foo(int a, int b);
...
int fee(int a, int b) { ... }
当然,除非您尝试从其他地方拨打foo
。然后链接器会抱怨。
答案 1 :(得分:1)
这是编译器的工作,根据我的经验,它做得很好:)
如果头文件中的函数原型与源文件中的定义不匹配,则不能在其他源文件中使用该函数,因为它未声明,编译器会通过给出错误通知您。
答案 2 :(得分:0)
如果使用该函数,如果原型的实现不存在,编译器将给出链接器错误。但是如果你从不使用该函数(例如,当你构建一个库时),链接器就不会抱怨。
这是您应该确保在测试中具有良好代码覆盖率的原因之一 - 如果您有一些单元测试也会被编译,链接器会抱怨。如果你有一些函数你无法测试并且不会从你的代码中调用,你可以编写一个虚拟可执行文件(它不需要工作),它将调用所有这些函数。
最后一个解决方案是使用clang库编写自己的代码检查器。