C/C++头文件保护的一点认识
我们在写C/C++头文件时,都知道开头要加上头文件保护,这样可以防止重复包含,如下这样, // file: test.h # ifndef _TEST_H_ # define _TEST_H_ // todo # endif 只要保证这个宏的名字是独一无二的就可以了。或者这样, // file: test.h # pragma once // todo 都可以达到相同效果。 大家有没有想过这样的问题: 所谓的防止重复包含,是作用在什么范围呢? 答案是 一个独立的编译单元 ,关于这个概念可以看 这篇文章 ,就是一个.c或.cpp文件,本人之前一直以为是整个代码工程里只展开一次,惭愧! 解释 假如工程中有个头文件叫common.h,还有2个.c文件叫aa.c和bb.c,aa.c包含了common.h,bb.c也包含了common.h,当进行预编译时,common.h会在aa.c和bb.c里都展开,而防止重复包含,是指在aa.c中只展开一次(aa.c里或者aa.c调用的头文件里可以多次包含common.h,但展开时只展开一次),同理,在bb.c里也是只展开一次。 这样,实际在整个工程中是展开了2次(仅对aa.c和bb.c来说)。 重复定义简析 这里再讲述一下代码编译过程中经常遇到的重复定义的问题,C/C++中变量只能定义一次,但是可以声明多次,如果写代码时把定义放到了头文件中