为什么在 C/C++ 中可以多次包含 Header?

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

在某些情况下,出于不同的目的,您希望多次包含相同的 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).