gcc编译器头文件处理

今天突然想到一个问题,c语言中我用#include"stdio.h",这样GCC会将头文件的内容插入到我的代码中,但是并不是这个头文件里的所有定义我都需要啊,为了验证GC... 今天突然想到一个问题,c语言中我用#include "stdio.h",这样GCC会将头文件的内容插入到我的代码中,但是并不是这个头文件里的所有定义我都需要啊,为了验证GCC会不会删除没有用到的定义,我分别写了两个.c文件,第一个
#include "stdio.h"

int main()
{ printf("hello world\n");

return 0;
}
这个文件编译出来是16KB,第二个文件
int printf (const char *__format, ...)
{
register int __retval;
__builtin_va_list __local_argv; __builtin_va_start( __local_argv, __format );
__retval = __mingw_vprintf( __format, __local_argv );
__builtin_va_end( __local_argv );
return __retval;
}

int main()
{ printf("hello world\n");

return 0;
}
这个文件编译出来是44KB,请问这是怎么回事,我手动删除了不需要的定义,便宜的.EXE文件不变小就算了,怎么还变大了
展开
 我来答
heptnaol
2018-02-23 · TA获得超过7261个赞
知道大有可为答主
回答量:7120
采纳率:78%
帮助的人:1804万
展开全部

两次相对比一下,第二次增加了以下函数的实现,这部分是要编译成机器指令的,所以第二次这部分相当于是增加的。

int printf (const char *__format, ...)
{
  register int __retval;
  __builtin_va_list __local_argv; __builtin_va_start( __local_argv, __format );
  __retval = __mingw_vprintf( __format, __local_argv );
  __builtin_va_end( __local_argv );
  return __retval;
}

那第二次减少了哪些呢?一点都没有,因为stdio这个头文件声明的函数和变量,都是在一个库中实现的,根本就不会包含在你的exe中,所以加不加stdio头文件没有区别。

要想验证这个也很简单:代码1

#include <stdio.h>
int main(){return 0;}

代码2:

int main(){return 0;}

比较这两次产生的exe是否一致即可。

注意,不能带有-g选项,-g选项会生成一些额外的调试信息

追问
这个库是动态库吗,也就是说第一个文件能用是因为安装电脑系统的时候装了这个库,而第二个文件则不依赖于操作系统,比如WINDOW,LINUX
匿名用户
2018-02-23
展开全部
没记错的话那些函数是预先装好的,也就是说使用的时候去调用其他地方的东西,这些东西不算在文件里,第一个文件直接去调用,而第二个文件你又把那些东西搬了进来,它就算进去了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式