为什么在C/C++中可以多次包含页眉
Why is it Possible in C/C++ to Include a Header Multiple Times?
-
考虑到为每个头文件添加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的操作)。
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 编译包含字符串的代码时遇到问题
- c++库的公共头文件中应该包含什么
- 将包含C样式数组的对象初始化为成员变量(C++)
- 是否需要删除包含对象的"pair"?
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 使用mongocxx驱动程序时包含头文件问题
- 如何在h文件中包含.o对象文件
- QTableView:endMoveRows在模型中重置水平页眉大小
- 在混合代码库中将C转换为C++时出现许多包含错误
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- cmath抛出错误C2062、C2059、C2143和C2447.cmath包含在矢量文件中
- 为什么您需要C++头文件的包含保护
- 为什么在C/C++中可以多次包含页眉
- 如何按顺序包含页眉
- 能够包含cpp..但不是页眉?发生了什么事
- MFC对话框包含文件的属性页在Visual Studio 2008中显示为空
- 页眉应包含一次