错误:`#elif with no expression` - 仅在 Windows 上发生
Posted
技术标签:
【中文标题】错误:`#elif with no expression` - 仅在 Windows 上发生【英文标题】:Error: `#elif with no expression` - happens only on Windows 【发布时间】:2014-04-30 13:32:35 【问题描述】:我正在尝试使用我在 Windows 上使用 MinGW 4.8.1 x86 制作的库来编译项目。该项目在 Linux 上编译良好。
Common.hpp 包含在所有其他内容之前,并根据当前操作系统定义了一些宏。然后 ConsoleFmt.hpp 被包含进来,它包含一个依赖于之前定义的宏的文件。
但是,我遇到了一个错误 - 这是代码和错误消息:
Common.hpp
#if (__linux || __unix || __posix)
#define SSVU_OS_LINUX
#elif (_WIN64 || _WIN32)
#define SSVU_OS_WINDOWS
#else
#define SSVU_OS_UNKNOWN
#endif
ConsoleFmt.hpp
#include "Common.hpp"
#ifdef SSVU_OS_LINUX
#include "SSVUtils/Core/ConsoleFmt/Internal/ConsoleFmtImplUnix.hpp"
#elif SSVU_OS_WINDOWS
#include "SSVUtils/Core/ConsoleFmt/Internal/ConsoleFmtImplWin.hpp"
#else
#include "SSVUtils/Core/ConsoleFmt/Internal/ConsoleFmtImplNull.hpp"
#endif
错误:
错误:#elif 没有表达式:
#elif SSVU_OS_WINDOWS
是我的代码无效还是 MinGW 中存在错误?我想我正确地使用了#elif
。
【问题讨论】:
介意解释否决票吗?#ifdef X
与#if defined(X)
相同,而不是#if X
。
【参考方案1】:
#elif
是 #else
和 #if
的缩写,而不是 #else
和 #ifdef
,所以你的行应该是:
#elif defined(SSVU_OS_WINDOWS)
编辑:由于未定义的宏在#if
表达式中扩展为0
,因此您也可以使用原始变体并使用值1
定义活动宏。 (正如 hvd 刚刚发布和解释的那样。)
【讨论】:
另外,defined
不是函数。不需要括号。
...但也不要受伤。我喜欢它们,就像sizeof
一样。 ;)【参考方案2】:
IMO 的安全解决方案是定义SSVU_OS_*
,使您使用#if
或#ifdef
都无关紧要。
#if (__linux || __unix || __posix)
#define SSVU_OS_LINUX 1
#elif (_WIN64 || _WIN32)
#define SSVU_OS_WINDOWS 1
#else
#define SSVU_OS_UNKNOWN 1
#endif
这让您的#ifdef
/#elif
可以按原样工作。为了保持一致性,您可以将其清理到
#if SSVU_OS_LINUX
#include "SSVUtils/Core/ConsoleFmt/Internal/ConsoleFmtImplUnix.hpp"
#elif SSVU_OS_WINDOWS
#include "SSVUtils/Core/ConsoleFmt/Internal/ConsoleFmtImplWin.hpp"
#else
#include "SSVUtils/Core/ConsoleFmt/Internal/ConsoleFmtImplNull.hpp"
#endif
但这并不是绝对必要的。
确保您的宏在不需要 #ifdef
/defined
检查的情况下工作,如果您组合多个检查,则可以使用更简单的表达式(就像您已经对其他人的宏所做的那样:您使用 ||
检查多个)。
【讨论】:
【参考方案3】:解释为什么它在 Linux 中有效但在 Windows 中失败:
#elif (_WIN64 || _WIN32)
如果 _WIN64
已定义,则它会被替换,例如如果这些已被定义
#define _WIN64
#define _WIN32
然后第一行扩展为
#elif ( || )
这会产生错误。但是,如果根本没有定义这些标记,它们将被 0
替换:
#elif (0 || 0)
没关系。
【讨论】:
以上是关于错误:`#elif with no expression` - 仅在 Windows 上发生的主要内容,如果未能解决你的问题,请参考以下文章
Node / Express with Graphql错误“_author2.default不是构造函数”
错误:找不到模块“eslint/lib/rules/no-unused-expressions”
得到一个预期的赋值或函数调用的错误,而是在反应中看到一个表达式 no-unused-expressions