谷歌没有帮助我解决一个简单的问题。在 C++ 中,在
#elif
上下文中使用 #ifdef
子句是否合法?它似乎可以在 c++11 模式下的所有主要编译器(MSVC 2015/2017、clang、GCC)中按预期进行编译和工作,但我不确定它是否符合标准。
对我来说,这个问题最重要的一点实际上是rosshjb在该问题下的评论:
@RemyLebeau 是的,我们可以将#ifdef 与#elif 一起使用。但是,如果我们在 #ifdef 情况下 #define 值为 0 的宏,则 #ifdef 情况会测试它是否为 true。否则,如果我们为 #elif 情况 #define 值为 0 的宏,则 #elif 情况会测试它为 false。 – rosshjb 2020-01-19 19:40
所以如果你有这样的块:
#ifdef __linux__
<some Linux code here>
#elif _WIN32
<some Windows code here>
#endif
然后第二个测试与第一个显着不同 - 第一个测试是检查
__linux__
是否已定义,第二个测试是检查符号 _WIN32
的计算结果是否为 true。在许多情况下,它的行为是相同的,但不能保证这样做。
完整等效实际上是:
#ifdef __linux__
<some Linux code here>
#elif defined(_WIN32)
<some Windows code here>
#endif
这对每个人来说可能并不明显。
使用 Kerrick SB 的答案,您还可以编写相同的
#if
语句:
#if defined(__linux__)
<some Linux code here>
#elif defined(_WIN32)
<some Windows code here>
#endif
这使得更明显的是,
defined
对于#if
和#elif
来说是相同的
是的,语法允许在前面添加
#elif
,匹配 #if
、#ifdef
或 #ifndef
:
if-部分:
if-group elif-groupsopt else-groupopt endif-lineif-group:
常量表达式 换行符 组opt# if
标识符 换行符 组选择# ifdef
标识符 换行符 组选择# ifndef
请注意,
#ifdef(X)
只是 #if defined(X)
的缩写,而 #ifndef(X)
则是 #if ! defined(X)
。
是的,这是允许的。
语法是:
if-group elif-groupsoptelse-groupoptendif-line
if-group
的定义不仅包括#if
,还包括#ifdef
和#ifndef
,所以#ifdef ... #elif ... #endif
就可以了。
@Michael Firth,你是对的。
#elif 不能与 #ifndef 或 #ifdef 一起使用,有些编译器允许,但有些编译器会出错。
例如: - 下面的示例将在某些示例中出现错误。
#ifndef SOME_MACRO
#elif (SOME_MACRO >=1)
#endif
例如: - 下面的示例将起作用 - 它已向标准投诉。 #ifndef SOME_MACRO #别的 #if (SOME_MACRO >=1) #万一 #endif