为什么在C / C ++中可能多次包含标头?

时间:2019-01-21 06:07:40

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

  • 考虑到要在每个头文件上添加包括保护措施的努力以及它们引入的错误(例如,在多个文件中使用相同的宏名称)的可能性,为什么它们不像默认行为?

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

  • 能够多次包含文件是否有实际好处?

1 个答案:

答案 0 :(得分:4)

在某些情况下,出于不同的目的,您想多次包含相同的标头。

  

能够多次包含文件是否有实际好处?

当然可以。另请参阅有关X-macros

例如,您要为颜色定义一些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;
  }
}

阅读documentation of cpp。上方的#Xstringizing X

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

令我惊讶的是,人们没有更多地了解到这种有用的技巧。当然,您可能希望添加更多注释以保持代码的可读性。

PS。请注意,C预处理及其宏是深刻(可悲的是)文本的-设计为字符串重写。 Common Lisp和TerraRust宏表明其他方法也是可行的(它们将其宏系统视为对AST s的操纵)。