Thursday, May 31, 2012

[Linux]那些真心烦人的GCC error/warning

众所周知, GCC不喜欢说人话. 很多warning/error message非常的confusing. 这里笔记一下我常常遇到的几个问题.
参考: GCC Warnings

no previous prototype for ‘foo’ [-Werror=missing-prototypes]
如果一个函数仅仅在一个文件中使用,函数定义时请使用static关键字修饰使其只能在本文件中可见,避免和namespace中其他文件定义的同名函数冲突. 如果会在多个文件中会被用到, 请将其函数原型放进一个.h文件中---这是最常见的C的用法.
注意如果foo这个函数没有输入参数, 在prototype里,请写成比如int foo(void)这样. 不然gcc会不认为int foo()是prototype

implicit declaration of function ‘foo’ [-Werror=implicit-function-declaration]
出现这个报错是由于你使用了一个函数,但是gcc不知道哪里去找这个函数declaration.
通常是由于没有include对正确的.h文件. 也有可能.h文件是正确的, 但是没有enable正确的宏. 比如在Linux上要使用CPU_SET这个宏, 除去include sched.h外, 还必须定义__USE_GNU这个宏.
#define __USE_GNU
#include <sched.h>

‘foo’ defined but not used [-Werror=unused-function]
有时候在调试程序过程中, 会暂时屏蔽一些函数的调用,从而得到如上的错误而防止编译. 为了"骗过"GCC, 你可以加上如下function attributes.
static __attribute__ ((unused)) void foo(){
...
}

No comments: