如何判断#define 是否有值

How to tell if a #define has a value or not

根据我对 C 预处理器的理解,您可以通过以下两种方式之一使用 #define

  1. #define SOME_VAL 3.4159f
  2. #define SOME_FLAG

我正在编写一个库,我正在使用#defines 来让用户解析与编译有关的设置。我的问题是我需要知道使用了上述两种情况中的哪一种。

示例: #define DISABLE_FEATURE#define DISABLE_FEATURE false.

有没有办法区分这两者,或者我必须在文档中指定使用哪一个?

您可以检查宏是否存在,例如

#if defined(SOME_FLAG)
...
#endif

参见例如this macro conditional reference.


话虽如此,不可能区分“空”宏(如示例中的 SOME_FLAG)和用整数文字 0 作为替换定义的宏。

另请注意,除非预处理器可以评估宏,否则您无法比较其“值”。

对于DISABLE_FEATURE这样的事情你可以做

#if defined(DISABLE_FEATURE) || DISABLE_FEATURE != false
    // Feature *is* disabled
#else
    // Feature is not disabled
#endif

do I have to specify in documentation which to use?

从技术上讲不,你不需要。但是你应该。

您可以通过执行以下操作轻松规范化检查错误:

#ifndef DISABLE_FEATURE
#define DISABLE_FEATURE false
#endif

// later
#if DISABLE_FEATURE == false
...

检查定义性的规范化有点棘手,因为您无法将空宏与值进行比较。但这是可能的。您可以使用这样的宏魔法(从 here 借用的扩展魔法):

#define DO_EXPAND(VAL)  VAL ## 1
#define EXPAND(VAL)     DO_EXPAND(VAL)

#if defined(DISABLE_FEATURE) \
    && (EXPAND(DISABLE_FEATURE) == false)
#undef DISABLE_FEATURE
#endif

// later
#ifdef DISABLE_FEATURE
...

我建议改为坚持一种方式并记录下来。我特别建议检查定义性,并完全忽略该值。