如何判断#define 是否有值
How to tell if a #define has a value or not
根据我对 C 预处理器的理解,您可以通过以下两种方式之一使用 #define
:
#define SOME_VAL 3.4159f
#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
...
我建议改为坚持一种方式并记录下来。我特别建议检查定义性,并完全忽略该值。
根据我对 C 预处理器的理解,您可以通过以下两种方式之一使用 #define
:
#define SOME_VAL 3.4159f
#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
...
我建议改为坚持一种方式并记录下来。我特别建议检查定义性,并完全忽略该值。