在C/C++编程中,我们经常需要引用其它的头文件。然而,由于编译器的预处理机制,会导致头文件的重复引用,进而出现编译错误。为了解决这个问题,我们常用的方法是给头文件加上头文件宏定义(Header Guard)。
具体操作就是在头文件开头加入定义如下的ifndef语句,以此保证该头文件只被编译一次。
#ifndef HEADER_GUARD_H#define HEADER_GUARD_H
// 此处为头文件内容
#endif // HEADER_GUARD_H
ifndef的主要作用是避免头文件被重复编译,以此加快编译速度。
如果我们没有使用头文件宏定义,可能会出现以下问题:
ifndef语法的完整形式为:
#ifndef token
其中token是用户自定义的标识符,通常是和头文件的名称一致,并且加上下划线和字母H组成。比如说,头文件名为header.h,那么定义的标识符就可以是HEADER_H。
需要注意的是,头文件宏定义中的标识符应该全部大写。
除了使用ifndef宏定义来避免头文件重复引用外,还可以使用“#pragma once”的方式来达到相同的效果。
其使用方式为:
#pragma once
使用起来简单,但它支持 degree of implementation的指令不够强劲,且#pragma once是非标准的预处理指令。
因此,我们通常建议使用ifndef宏定义来避免头文件的重复引用。