-
考虑到为每个头文件添加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的操作)。