如何判断#define 是否有值

Ebo*_*ers 1 c++ c-preprocessor

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

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

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

示例: #define DISABLE_FEATURE#define DISABLE_FEATURE false

有没有办法让我区分这两者,还是必须在文档中指定要使用的?

eer*_*ika 5

我是否必须在文档中指定要使用的内容?

技术上不,你没有。但你应该。

您可以通过执行以下操作轻松标准化检查 false:

#ifndef DISABLE_FEATURE
#define DISABLE_FEATURE false
#endif

// later
#if DISABLE_FEATURE == false
...
Run Code Online (Sandbox Code Playgroud)

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

#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
...
Run Code Online (Sandbox Code Playgroud)

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