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,但是因为判断不成立,并没有真正的包含进去。
相同的头文件在一个源码文件中可以重复包含,因为预处理指令的存在,所以并不会出问题。
全部0条评论
快来发表一下你的评论吧 !