将#elif与#ifdef一起使用合法吗

Is it legal to use #elif with #ifdef?

本文关键字:一起 #elif #ifdef      更新时间:2023-10-16

一个谷歌帮不了我的简单问题。在C++中,在#ifdef的上下文中使用#elif子句合法吗?它似乎可以像预期的那样在c++11模式下与所有主要编译器一起编译和工作(MSVC 2015/2017,clang,GCC),但我不确定它是否符合标准。

是的,语法允许#elif在前面,匹配#if#ifdef#ifndef:

如果部分
 nbsp如果组elif组optelse组>optendif行

如果组
 nbsp;# if常量表达式新行>opt
 nbsp;# ifdef标识符新行组>opt
nbsp # ifndef标识符新行组>opt

请注意,#ifdef(X)只是#if defined(X)的缩写,#ifndef(X)#if ! defined(X)的缩写。

对我来说,这个问题上最重要的一点实际上是rosshjb在这个问题下的评论:

@RemyLebeau是的,我们可以将#ifdef与#elif一起使用。但是,如果我们为#ifdef用例定义了值为0的宏,那么#ifdef用例会测试它为true。否则,如果我们为#elif用例#定义值为0的宏,则#elif案例会将其测试为false。–rosshjb一月19'20在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组opt其他组optendif行

if-group的定义不仅包括#if,还包括#ifdef#ifndef,因此#ifdef ... #elif ... #endif是可以的。