为什么不包含头文件不报错

vv1133 2010-05-30 04:47:56
使用gcc的编译器 头文件没有包含stdlib.h,编译却没有出错
如果编译的时候加上-Wall选项,会有个警告,请问这是为什么?
...全文
733 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
happytang 2010-05-31
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 arong1234 的回复:]

不是告诉你了么,编译器对于没有定义过的函数原型直接当作它返回int,它不需要知道它已经定义过了

也就是说,当你以一个参数列表调用atoi时,编译器已经知道这个函数的参数列表是什么,它只不知道返回值而已,在这种情况下,编译器还需要什么额外的东西呢?它当然可以通过。

注意:编译器不关心某个函数在哪个头文件被定义,它只需要知道这个函数是什么原型即可

引用 9 楼 vv1133 的回复……
[/Quote]
这是gcc编译器的通用原则吗
vv1133 2010-05-30
  • 打赏
  • 举报
回复
上面有点错printf("i=%d f=%lf\n", i, f);结果没影响
baiye1134 2010-05-30
  • 打赏
  • 举报
回复
我是路过的
vv1133 2010-05-30
  • 打赏
  • 举报
回复
谢谢了

我说下测试情况
#include<stdio.h>
//#include<stdlib.h>
int main()
{
int i;
double f;
char b[5] = "23";
char c[5] = "2.3";
i = atoi(b);
f = atof(c);
printf("i=%d f=%f\n", i, f);
return 0;
}
gcc test.c -o test没有任何警告
gcc -Wall test.c -o test
出现警告:w9.c: In function `main':
w9.c:9: warning: implicit declaration of function `atoi'
w9.c:10: warning: implicit declaration of function `atof'
输出结果:
i=23 f=1717986918.000000

加上#include<stdlib.h>则结果正常


[Quote=引用 11 楼 arong1234 的回复:]
不是告诉你了么,编译器对于没有定义过的函数原型直接当作它返回int,它不需要知道它已经定义过了

也就是说,当你以一个参数列表调用atoi时,编译器已经知道这个函数的参数列表是什么,它只不知道返回值而已,在这种情况下,编译器还需要什么额外的东西呢?它当然可以通过。

注意:编译器不关心某个函数在哪个头文件被定义,它只需要知道这个函数是什么原型即可


引用 9 楼 vv1133 的回……
[/Quote]
arong1234 2010-05-30
  • 打赏
  • 举报
回复
不是告诉你了么,编译器对于没有定义过的函数原型直接当作它返回int,它不需要知道它已经定义过了

也就是说,当你以一个参数列表调用atoi时,编译器已经知道这个函数的参数列表是什么,它只不知道返回值而已,在这种情况下,编译器还需要什么额外的东西呢?它当然可以通过。

注意:编译器不关心某个函数在哪个头文件被定义,它只需要知道这个函数是什么原型即可

[Quote=引用 9 楼 vv1133 的回复:]
多谢,可是我还是没弄明白,没有包含这个头文件,编译器是怎么知道atoi这个函数已经定义过了?

引用 5 楼 arong1234 的回复:
这是因为C语言一个非常傻的规定:一个函数如果没有声明函数原型,其返回值类型就是int(所谓的implicit declaration)。由于atoi恰好真返回int,所以你即使不包含它的头文件也不报错。至于这个警告,是为了避免你由于忘记声明函数原型而出错……
[/Quote]
cattycat 2010-05-30
  • 打赏
  • 举报
回复
arong说的真不错
vv1133 2010-05-30
  • 打赏
  • 举报
回复
多谢,可是我还是没弄明白,没有包含这个头文件,编译器是怎么知道atoi这个函数已经定义过了?
[Quote=引用 5 楼 arong1234 的回复:]
这是因为C语言一个非常傻的规定:一个函数如果没有声明函数原型,其返回值类型就是int(所谓的implicit declaration)。由于atoi恰好真返回int,所以你即使不包含它的头文件也不报错。至于这个警告,是为了避免你由于忘记声明函数原型而出错。

个人建议你还是把stdlib.h包含上,虽然隐式声明可以帮助你,不过还是建议避免使用这种比较傻的特性。

引用 4 楼 vv1133……
[/Quote]
ArtiFly2000 2010-05-30
  • 打赏
  • 举报
回复
默认情况下,gcc帮你自动纠错了,gcc的纠错能力还是很强的
wall参数就是告诉gcc在自动纠错的同时,将错误的地方通知你一下,所有gcc就给你个warning
东莞某某某 2010-05-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 arong1234 的回复:]

这是因为C语言一个非常傻的规定:一个函数如果没有声明函数原型,其返回值类型就是int(所谓的implicit declaration)。由于atoi恰好真返回int,所以你即使不包含它的头文件也不报错。至于这个警告,是为了避免你由于忘记声明函数原型而出错。

个人建议你还是把stdlib.h包含上,虽然隐式声明可以帮助你,不过还是建议避免使用这种比较傻的特性。
引用 4 楼 vv1133 ……
[/Quote]

阿荣哥,拜一个!
东莞某某某 2010-05-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 vv1133 的回复:]

因为atoi函数在stdlib.h中才有声明,警告是warning: implicit declaration of function `atoi'
为什么说是隐式声明atoi函数,在哪隐式声明的?
引用 2 楼 arong1234 的回复:
为什么一定要stdlib.h?不是说每个程序都必须包含某个头文件的
遇到的警告是什么?

引用楼主 vv1133 的回复:
使用gcc的编译……
[/Quote]

是不是因为没有包含stdlib.h,即没有显示声明stoi函数,所以叫做“隐式声明”。include一下,是不是就没有这个警告了
arong1234 2010-05-30
  • 打赏
  • 举报
回复
这是因为C语言一个非常傻的规定:一个函数如果没有声明函数原型,其返回值类型就是int(所谓的implicit declaration)。由于atoi恰好真返回int,所以你即使不包含它的头文件也不报错。至于这个警告,是为了避免你由于忘记声明函数原型而出错。

个人建议你还是把stdlib.h包含上,虽然隐式声明可以帮助你,不过还是建议避免使用这种比较傻的特性。
[Quote=引用 4 楼 vv1133 的回复:]
因为atoi函数在stdlib.h中才有声明,警告是warning: implicit declaration of function `atoi'
为什么说是隐式声明atoi函数,在哪隐式声明的?

引用 2 楼 arong1234 的回复:
为什么一定要stdlib.h?不是说每个程序都必须包含某个头文件的
遇到的警告是什么?

引用楼主 vv1133 的回复:
使用gcc的编……
[/Quote]
vv1133 2010-05-30
  • 打赏
  • 举报
回复
因为atoi函数在stdlib.h中才有声明,警告是warning: implicit declaration of function `atoi'
为什么说是隐式声明atoi函数,在哪隐式声明的?
[Quote=引用 2 楼 arong1234 的回复:]
为什么一定要stdlib.h?不是说每个程序都必须包含某个头文件的
遇到的警告是什么?

引用楼主 vv1133 的回复:
使用gcc的编译器 头文件没有包含stdlib.h,编译却没有出错
如果编译的时候加上-Wall选项,会有个警告,请问这是为什么?
[/Quote]
happytang 2010-05-30
  • 打赏
  • 举报
回复
warning all
arong1234 2010-05-30
  • 打赏
  • 举报
回复
为什么一定要stdlib.h?不是说每个程序都必须包含某个头文件的
遇到的警告是什么?[Quote=引用楼主 vv1133 的回复:]
使用gcc的编译器 头文件没有包含stdlib.h,编译却没有出错
如果编译的时候加上-Wall选项,会有个警告,请问这是为什么?
[/Quote]
AlanBruce 2010-05-30
  • 打赏
  • 举报
回复
...................

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧