C语言中的头文件能不能重复包含

描述

C语言中的头文件能不能重复包含?

比如代码写成这样,stdio.h 连续包含了两次。

#include 
#include 

int main()
{
    printf("helloworld
");
    return 0;
}

我们先来编译看下,好像没有任何问题。

root@Turbo:~# gcc test.c -o test 
root@Turbo:~#

同一个头文件,随便包含多少次,都不会有问题,主要是这两行代码起了作用。

#ifndef _STDIO_H
#define _STDIO_H    1

写头文件的时候,习惯上都会加上两个预处理指令,ifndef 和 define。

就以这个 test.h 为例:

#ifndef TEST_H
#define TEST_H

struct Test
{
    int a;
};

#endif

在 test.h 里面声明了一个结构体,然后在源文件中包含了两次。

头文件往往在编译的第一步,预处理的时候展开。

第一次展开 test.h 的时候,会遇到预处理指令 ifndef:

#ifndef TEST_H

翻译过来就是如果没有定义这个宏。

很显然,这个宏确实没有定义过,于是判断成立。

继续往下走,遇到 define:

#define TEST_H

意思就是把这个宏定义一下。

然后就是把 test.h 里面的内容搬到源文件中,这就是所谓的展开。

第二次包含 test.h 的时候,重复上面的操作。

先是遇到 ifndef,很显然,这个宏刚才定义过,于是这条预处理指令不成立,下面的所有代码都会跳过。

这样就清楚了,虽然我们在源码里面包含了 test.h,但是因为判断不成立,并没有真正的包含进去。

相同的头文件在一个源码文件中可以重复包含,因为预处理指令的存在,所以并不会出问题。
 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分