我有两个文件。
第一个文件包含函数原型,main函数只用一个参数调用myfunc:
int myfunc (int x);
int main ()
{
int x =5;
myfunc(x);
}
,第二个文件包含函数定义但有2个参数:
int myfunc (int x, int y)
{
return x+y;
}
当我尝试使用GCC编译这两个文件时,我没有收到任何错误或警告。
如何强制GCC警告这类事情?
答案 0 :(得分:8)
将原型放在头文件中,并将#include
头文件放在使用这些函数的所有源文件中。
GCC独立编译每个文件,因此它不能知道函数的定义与声明不对应,除非声明也包含在带有定义的文件中。
它应该是这样的:
#ifndef MYFUNC_H
#define MYFUNC_H
int myfunc (int x);
#endif
#include "myfunc.h"
int myfunc (int x, int y)
{
return x+y;
}
#include "myfunc.h"
int main ()
{
int x =5;
myfunc(x);
}
答案 1 :(得分:1)
因为两个源文件是完全分开编译的两个不同的translation units,所以编译器无法知道这一点。由于C符号确实没有关于参数的信息,链接器也不能对此发出警告。
唯一的解决方案是将函数原型放在所有相关源文件中包含的头文件中。