- 论坛徽章:
- 0
|
本帖最后由 timothyqiu 于 2013-03-09 14:06 编辑
- void test(){
- printf("test\n");
- test2();
- }
复制代码 隐式函数声明
早先的 C 标准允许隐式函数声明。也就是说,编译的时候,如果没有找到函数 foo 的声明,就默认为存在一个形同 int foo() 的声明(接受任何类型输入,返回一个 int),使得编译能够进行下去。
而 GCC 的默认标准 -std 是 C89,允许隐式函数声明。
那么很好,这段代码里的 printf 和 test2 都会得到一个隐式声明:int printf() 和 int test2()。
如果不考虑其它特殊情况,编译是能够通过的。但是,为什么 printf 会被警告呢?那么就要提到下面这个问题。
GCC 的内置函数
常用的诸如 printf / malloc 之类函数 GCC 都有内置。也就是说,即使你不 include,GCC 也知道世界上存在着一个 int printf(char const *, ...) 的声明。
那么好了,上面编译时产生的隐式函数声明 int printf() 和 GCC 内置的 int printf(char const *, ...) 冲突,所以就生成了一个警告。
可以使用 -fno-builtin 关掉所有的内置函数,或者 -fno-builtin-printf 关掉内置的 printf 函数。这样就不会有冲突了。当然,在每一个编译单元里都手动 include 才是正道。 |
|