View on GitHub

开源开发工具技术博客

编译器/工具链、模拟器、虚拟机、Linux内核、调试和性能分析工具

xmj@hellogcc.org

将函数声明放在头文件里,然后在C文件中包含进来,是一个好的习惯。不然,则可有能导致系统中非常隐蔽的错误。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ cat prototype.c
int
main (void)
{
 fun (1);
 return 0;
}
 
void
fun (void)
{
}
 
$ gcc prototype.c
prototype.c:9: warning: conflicting types for ‘fun’
prototype.c:4: note: previous implicit declaration of ‘fun’ was here

这里,gcc只给出了警告信息!然而不匹配的传参操作很可能会造成部分代码(还是数据?)被覆写,程序便会出现非常诡异的现象。

1
2
3
4
5
6
$ gcc prototype.c -Werror=implicit-function-declaration
prototype.c: In function ‘main’:
prototype.c:4: error: implicit declaration of function ‘fun’
prototype.c: At top level:
prototype.c:9: warning: conflicting types for ‘fun’
prototype.c:4: note: previous implicit declaration of ‘fun’ was here

可以强制将警告信息升级为错误信息来避免这类问题。

后记(来自xunxun):

可以直接打开-Werror检查所有的warning。

另外,检查语法是否合乎指定的标准(ISO标准)可以用下列开关

检查C99
-std=c99 -pedantic
当然可以用
-pedantic-errors
不产生警告直接提示错误