对c语言预处理中头文件包含的一些新的理解
2017-12-23 23:15
211 查看
对于一个c的源文件而言,它可以单独被编译,也就是说编译的单位就是源文件。虽然在编译的时候可以指定多个源文件,但是编译器(如gcc)内部还是一个接着一个编译成目标文件的,最后在链接的时候才是多个目标文件一起进行链接的。
我们都听说过或者说好多资料书上都有写,在大规模的c程序中需要头文件保护,也就是使得同一个头文件只能被包含一次。但是这里没有说清楚的是头文件只能包含一次的上下文。
举个例子假设我们程序只有一个a.c文件,在该文件中包含了两次<stdio.h>,那么编译a.c文件的时候,实际在预处理时,因为有头文件保护所以实际情况下<stido.h>只是被包含了一次,我们可以通过gcc -E a.c这条命令可以看出;假设我们程序有a.c和b.c这两个文件,这两个文件各只包含一次<stdio.h>,那么在编译a.c和b.c的时候,<stdio.h>这个头文件又被包含了几次呢,一次?如果使用gcc -E a.c b.c这条命令我们可以看出<stido.h>实际上被包含了两次,不是有头文件保护吗,为什么包含了两次。答案很简单,因为编译的时候是以源文件为单位的,也就是说在编译一个源文件这个上下文中,同一个头文件只能被包含一次,而不是对一个程序中的多个源文件而言同一个头文件只能包含一次。
最后总结一下,在有头文件保护以及一个源文件编译的时候,同一个头文件才只能被包含一次。
我们都听说过或者说好多资料书上都有写,在大规模的c程序中需要头文件保护,也就是使得同一个头文件只能被包含一次。但是这里没有说清楚的是头文件只能包含一次的上下文。
举个例子假设我们程序只有一个a.c文件,在该文件中包含了两次<stdio.h>,那么编译a.c文件的时候,实际在预处理时,因为有头文件保护所以实际情况下<stido.h>只是被包含了一次,我们可以通过gcc -E a.c这条命令可以看出;假设我们程序有a.c和b.c这两个文件,这两个文件各只包含一次<stdio.h>,那么在编译a.c和b.c的时候,<stdio.h>这个头文件又被包含了几次呢,一次?如果使用gcc -E a.c b.c这条命令我们可以看出<stido.h>实际上被包含了两次,不是有头文件保护吗,为什么包含了两次。答案很简单,因为编译的时候是以源文件为单位的,也就是说在编译一个源文件这个上下文中,同一个头文件只能被包含一次,而不是对一个程序中的多个源文件而言同一个头文件只能包含一次。
最后总结一下,在有头文件保护以及一个源文件编译的时候,同一个头文件才只能被包含一次。
相关文章推荐
- IOS开发---C语言-㉑预处理指令:宏定义、条件编译、文件包含
- c语言的预处理指令分3种 1> 宏定义 2> 条件编译 3> 文件包含
- 【C语言】17-预处理指令3-文件包含
- C语言及程序设计进阶例程-9 预处理之文件包含
- 【C语言】17-预处理指令3-文件包含
- C语言 预处理一(文件包含--#include)
- 【C语言】17-预处理指令3-文件包含
- 【C语言】17-预处理指令3-文件包含
- 【C语言】预处理指令—文件包含
- C语言 预处理指令 3文件包含
- [C语言]菜鸟的一些理解-预处理
- C语言预处理指令:宏、条件编译、文件包含
- 【C语言】17-预处理指令3-文件包含
- C语言-预处理指令3-文件包含
- 【C语言】17-预处理指令3-文件包含
- 【C语言】17-预处理指令3-文件包含
- 【C语言】17-预处理指令3-文件包含
- 【C语言】15 预处理指令--文件包含
- 【C语言】17-预处理指令3-文件包含
- C语言预处理概述以及文件包含命令