为什么在 C/C++ 中可以多次包含 Header?
Why is it Possible in C/C++ to Include a Header Multiple Times?
考虑到它为每个 header 文件添加包含保护所付出的努力以及它们引入错误的可能性增加(例如,在多个文件中使用相同的宏名称),为什么它们不是作为默认行为内置到语言中的吗?
哪些语言设计权衡导致 C/C++ 标准的制定者做出此决定?
能够多次包含文件有什么实际好处吗?
在某些情况下,出于不同的目的,您希望多次包含相同的 header。
Are there any practical benefits for being able to include files multiple times?
当然可以。 另请参阅 X-macros。
例如,您正在为颜色定义一些 enum
。
你可以 myenum.h
header
// file myenum.h included several times
MYENUM(red)
MYENUM(blue)
MYENUM(yellow)
(你可以想象那里有数百种其他颜色,你不想重复)
然后,在您的 main.c
文件(或某些受保护的 header 文件中),您使用以下方式声明该枚举:
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;
}
}
阅读 documentation of cpp
. The #X
above is stringizing X
请注意,即使使用现代 C++,对模板做同样的事情也非常困难(或者仍然不可能)。
我很惊讶人们没有更多地学习这些有用的技巧。当然,您可能希望添加更多注释以保持代码的可读性。
PS。请注意,C 预处理及其宏是深刻的(遗憾的是)文本 - 设计为字符串重写。 Common Lisp 和 Terra and Rust macros show that other approaches are possible (they view their macro system as manipulation of ASTs).
考虑到它为每个 header 文件添加包含保护所付出的努力以及它们引入错误的可能性增加(例如,在多个文件中使用相同的宏名称),为什么它们不是作为默认行为内置到语言中的吗?
哪些语言设计权衡导致 C/C++ 标准的制定者做出此决定?
能够多次包含文件有什么实际好处吗?
在某些情况下,出于不同的目的,您希望多次包含相同的 header。
Are there any practical benefits for being able to include files multiple times?
当然可以。 另请参阅 X-macros。
例如,您正在为颜色定义一些 enum
。
你可以 myenum.h
header
// file myenum.h included several times
MYENUM(red)
MYENUM(blue)
MYENUM(yellow)
(你可以想象那里有数百种其他颜色,你不想重复)
然后,在您的 main.c
文件(或某些受保护的 header 文件中),您使用以下方式声明该枚举:
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;
}
}
阅读 documentation of cpp
. The #X
above is stringizing X
请注意,即使使用现代 C++,对模板做同样的事情也非常困难(或者仍然不可能)。
我很惊讶人们没有更多地学习这些有用的技巧。当然,您可能希望添加更多注释以保持代码的可读性。
PS。请注意,C 预处理及其宏是深刻的(遗憾的是)文本 - 设计为字符串重写。 Common Lisp 和 Terra and Rust macros show that other approaches are possible (they view their macro system as manipulation of ASTs).