防止将标头包含在C中的同一文件中

时间:2019-02-04 16:57:34

标签: c gcc c-preprocessor

我正在寻找一种强制某些标头不能包含在同一文件中的方法。

为进一步说明情况,假设我有标题

a_1.h, b_1.h

a_2.h, b_2.h

我想防止_1_2文件包含在同一文件中,无论它们是否为

a_ or b_

2 个答案:

答案 0 :(得分:6)

假定混合_1_2标头是一个错误,需要捕获,一种简单的捕获方法是定义并检查防护宏,以检查这些标头和使用#error指令报告错误。

例如,a_1.h标头可以包含以下代码:

#ifndef A_1_H__INCLUDED
#define A_1_H__INCLUDED

/* Define header set as 1 if not already defined. */
#ifndef HEADER_SET
#define HEADER_SET 1
#endif

/* Check for consistent header set usage. */
#if HEADER_SET != 1
#error "Inconsistent header sets"
#endif

/* Other header stuff ... */

#endif /* A_1_H__INCLUDED */

其他标头将相似,但_2标头将具有#define HEADER_SET 2#if HEADER_SET != 2

答案 1 :(得分:1)

请记住,构建过程中的任何其他文件都可以包含标头。使用典型的包含保护:#ifndef MYHEADER \n #include MYHEADER,标头代码仅插入第一个实例。之后,编译器将其吃掉并记住并且不需要再次包含它。将编译视为将所有源代码放入一个文件并将其转换为二进制文件。 (您知道,“编译”就像将所有内容堆在一起一样)。因此,它不是“进入同一文件”,而是“进入同一内部版本”。

您希望头文件与另一个头文件互斥。 (比方说,如果您具有通过包含针对特定硬件的代码,并且显然不能同时构建为两个芯片。)首先,如果这是一个问题,则实际上应该在一个地方这样的事情已经定义(例如构建脚本),所以这不是问题。但是,如果您想要一个简单的保护措施:

#ifndef PPC_e6500
#define PPC_e6500
#ifdef LINUX
#error This processor ain't big enough for the both of us, Tux. This here's 8548 territory!
#endif

那将无法建立,您可以找出是谁做的可怕的事情试图一次朝两个目标发展。