我们在写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++中变量只能定义一次,但是可以声明多次,如果写代码时把定义放到了头文件中,那么就像刚才分析的那样,多个.c或.cpp文件中展开相同头文件时,就会变成多次重复定义,所以就会出错,所以头文件中只能放置声明。
同理,函数的重复定义也是类似。
来源:CSDN
作者:爱是恒久忍耐1989
链接:https://blog.csdn.net/whahu1989/article/details/104087198