为什么在C/C++中可以多次包含页眉

Why is it Possible in C/C++ to Include a Header Multiple Times?

本文关键字:包含页 C++ 为什么      更新时间:2023-10-16
  • 考虑到为每个头文件添加include保护所做的努力,以及它们引入错误的可能性(例如,在多个文件中使用相同的宏名称),为什么它们不作为默认行为构建到语言中?

  • 是什么样的语言设计权衡导致了C/C++标准的制定者做出这一决定?

  • 能够多次包含文件有什么实际好处吗?

在某些情况下,为了不同的目的,您需要多次包含同一个标头。

能够多次包含文件有什么实际好处吗?

当然可以另请阅读有关X宏的内容。

例如,您正在为颜色定义一些enum

你可以有一个带有的myenum.h标头

// file myenum.h included several times
MYENUM(red)
MYENUM(blue)
MYENUM(yellow)

(你可以想象那里有数百种其他颜色,你不想重复)

然后,在main.c文件(或某个保护头文件)中,使用声明该枚举

enum color_en {
#define MYENUM(X) X,
#include "myenum.h"
#undef MYENUM
};

在同一个main.c文件中,您稍后有一个打印例程:

void print_color(enum color_en col) {
switch (col) {
#define MYENUM(X) case X: puts(#X); break;
#include "myenum.h"
#undef MYENUM
default: puts("???"); break;
}
}

阅读cpp的文档。上面的#X是字符串化X

请注意,即使使用现代C++,使用模板也会非常困难(或者仍然不可能)。

我很惊讶人们没有更多地了解这种有用的技巧。当然,您可能想要添加更多的注释来保持代码的可读性。

PS。请注意,C预处理及其宏是作为字符串重写而进行的(可悲的)文本设计。常见的Lisp、Terra和Rust宏表明,其他方法也是可能的(他们将宏系统视为对AST的操作)。