C/C++头文件保护的一点认识

柔情痞子 提交于 2020-01-28 14:00:13

我们在写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文件中展开相同头文件时,就会变成多次重复定义,所以就会出错,所以头文件中只能放置声明。

同理,函数的重复定义也是类似。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!