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文件不变小就算了,怎么还变大了 展开
#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文件不变小就算了,怎么还变大了 展开
2个回答
展开全部
两次相对比一下,第二次增加了以下函数的实现,这部分是要编译成机器指令的,所以第二次这部分相当于是增加的。
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
展开全部
没记错的话那些函数是预先装好的,也就是说使用的时候去调用其他地方的东西,这些东西不算在文件里,第一个文件直接去调用,而第二个文件你又把那些东西搬了进来,它就算进去了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询