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

在C预处理器中定义自身

  •  7
  • klutt  · 技术社区  · 7 年前

    我遇到了以下几行:

    #define bool  bool
    #define false false
    #define true  true
    

    我不认为我需要说的比“wtf”还要多,但需要明确的是:定义事物本身的意义是什么?

    线路来自 clang stdbool.h

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

    C和C++标准明确允许这样做(并要求没有无限扩展)

    顺便说一句,类似递归(或 self-refential )宏更有用:

    #define puts(X) (nblines++,puts(X))
    

    (内部 puts 是对标准的呼唤 作用宏通过计数“重载”此类进一步调用 nblines )

    您的定义可能很有用,例如,对于以后的构造,如 #ifdef true ,这不可能是一个简单的 #define true 因为这将“抹去”每一次进一步使用 true ,所以它必须是 #define true true .

        2
  •  7
  •   Petr Skocik    7 年前

    它允许用户代码根据是否定义这些宏进行有条件编译:

    #if defined(bool)
        /*...*/
    #else
        /*...*/
    #endif
    

    HAVE_BOOL ),前提是实现让其用户知道 敌我识别 它提供了一个 bool ,它还将提供一个与扩展到它的宏同名的宏(或者实现可能只是在内部将其用于自己的预处理器条件)。

        3
  •  4
  •   Community CDub    4 年前

    它被称为自参考宏。

    根据 gcv 参考:

    Aself referentialmacro的名称出现在其定义中。 代替如果自参考被视为宏的使用,则 自引用不被视为宏调用。它被传递到 预处理器输出不变。

    参考示例:

    自引用的一个常见而有用的用法是创建一个扩展到自身的宏。如果你写信

    #define EPERM EPERM

    然后,宏表达式扩展到Perm。事实上,它被单独留下了 由预处理器在运行文本时使用。你可以看出来 这是一个带有#ifdef的宏。如果你愿意,你可以这样做 使用enum定义数值常量,但对于 每个常数。