c++ - 为什么在 C/C++ 中可以多次包含一个 header ?

标签 c++ c language-design include-guards

  • 考虑到为每个头文件添加包含保护所付出的努力以及它们引入的错误的可能性(例如,在多个文件中使用相同的宏名称),为什么它们不构建到语言中默认行为?

  • 哪些语言设计权衡导致 C/C++ 标准制定者做出这一决定?

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

最佳答案

在某些情况下,您希望出于不同目的多次包含相同的 header 。

Are there any practical benefits for being able to include files multiple times?

当然可以。另请阅读 X-macros .

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

您可以有一个 myenum.h header ,其中

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

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

然后,在您的 main.c 文件中(或在某些 protected 头文件中),您可以使用以下方式声明该枚举:

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 。上面的#X是stringizing X

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

我很惊讶人们没有被更多地教导这些有用的技巧。当然,您可能希望添加更多注释以保持代码的可读性。

PS。请注意,C 预处理及其宏在本质上是(遗憾的是)文本化的——设计为字符串重写。 Common Lisp 和 TerraRust宏表明其他方法也是可能的(他们将宏系统视为对 AST 的操纵)。

关于c++ - 为什么在 C/C++ 中可以多次包含一个 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54284279/

相关文章:

c++ - JUCE - 制作一个新窗口

c - 如何将 getchar() 与字符串一起使用?

c - C 中的重音/变音字符?

c - 带有 switch 语句的交互式菜单

javascript - "monkey patching"真的那么糟糕吗?

c# - 如何将对 COM 对象的 C# 引用传递给 C++ DLL

C++11模板别名作为模板模板参数导致不同的类型?

c++ - 将一行二维数组分配给一维数组

scala - Clojure 协议(protocol)与 Scala 结构类型

c++ - 为什么 C++ 要求仅针对 float、double 或 long double 实例化该复数?