错误:`#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”

9.if/else/elif

得到一个预期的赋值或函数调用的错误,而是在反应中看到一个表达式 no-unused-expressions

用 chai 摆脱 no-unused-expressions linter 错误的好方法

没有“WITH NO SCHEMA BINDING”的视图返回关系“不存在”错误