将 #elif 与 #ifdef 一起使用是否合法?

问题描述 投票:0回答:4

谷歌没有帮助我解决一个简单的问题。在 C++ 中,在

#elif
上下文中使用
#ifdef
子句是否合法?它似乎可以在 c++11 模式下的所有主要编译器(MSVC 2015/2017、clang、GCC)中按预期进行编译和工作,但我不确定它是否符合标准。

c++ c-preprocessor preprocessor preprocessor-directive
4个回答
22
投票

对我来说,这个问题最重要的一点实际上是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

来说是相同的

21
投票

是的,语法允许在前面添加

#elif
,匹配
#if
#ifdef
#ifndef

if-部分
    if-group elif-groupsopt else-groupopt endif-line

if-group:
   

# if
常量表达式 换行符 opt
   
# ifdef
标识符 换行符 选择
   
# ifndef
标识符 换行符 选择

请注意,

#ifdef(X)
只是
#if defined(X)
的缩写,而
#ifndef(X)
则是
#if ! defined(X)


6
投票

是的,这是允许的。

语法是:

if-group elif-groupsoptelse-groupoptendif-line

if-group
的定义不仅包括
#if
,还包括
#ifdef
#ifndef
,所以
#ifdef ... #elif ... #endif
就可以了。


0
投票

@Michael Firth,你是对的。

#elif 不能与 #ifndef 或 #ifdef 一起使用,有些编译器允许,但有些编译器会出错。

例如: - 下面的示例将在某些示例中出现错误。

#ifndef SOME_MACRO
#elif (SOME_MACRO >=1)
#endif

例如: - 下面的示例将起作用 - 它已向标准投诉。 #ifndef SOME_MACRO #别的 #if (SOME_MACRO >=1) #万一 #endif

© www.soinside.com 2019 - 2024. All rights reserved.