将#elif与#ifdef一起使用合法吗
Is it legal to use #elif with #ifdef?
一个谷歌帮不了我的简单问题。在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
是可以的。
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将C++中的库和头与MinGW一起使用
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我不能将 rand() 与数组的大小一起使用?
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 将fold表达式与std::一起用于两个元组
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 将 std::allocate_shared 与多态资源分配器一起使用
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 将 exprtk 与自定义类的对象一起使用
- 将 std::set 与基于键的比较器一起使用
- 将 C++ 类与 Rcpp 一起使用,从 C 或 R 修改它
- 如何将 Eigen::Ref 与 pybind11 一起使用?
- 如何将AERT_Allocate与 std:vector 一起使用
- 如何使我的 sizeof sum 结构与空参数包一起工作
- 将#elif与#ifdef一起使用合法吗