代码之家  ›  专栏  ›  技术社区  ›  pooya13

为什么C/C++中包含多个报头是可能的?[复制品]

  •  -1
  • pooya13  · 技术社区  · 5 年前
    • 考虑到它所做的努力包括为每个头文件添加保护,以及它们引入错误的附加可能性(例如,在多个文件中使用相同的宏名),为什么它们不作为默认行为内置到语言中?

    • 什么样的语言设计折衷导致了C/C++标准的制定者的决定?

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

    1 回复  |  直到 5 年前
        1
  •  3
  •   Basile Starynkevitch    5 年前

    在某些情况下,为了不同的目的,您希望多次包含相同的头。

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

    当然可以。 阅读有关 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
    };
    

    并在同一 主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++,与模板进行相同的操作也是非常困难的(或者仍然是不可能的)。

    我很惊讶人们对这种有用的技巧没有更多的了解。当然,您可能需要添加更多的注释来保持代码的可读性。

    注意,C预处理和它的宏是深刻的(不幸的)文本化的——设计为字符串重写。常见Lisp Terra Rust 宏显示其他方法是可行的(它们将其宏系统视为对 AST s)。