错误"token is not a valid binary operator in a preprocessor subexpression"

Error "token is not a valid binary operator in a preprocessor subexpression"

本文关键字:operator in preprocessor subexpression binary valid is not 错误 token      更新时间:2023-10-16

如果我构建并运行一个项目,基本上是Mac OS 10.6上的Qt框架生成的存根,我得到此错误输出:

/Users/home/Qt5.0.1/5.0.1/clang_64/include/QtCore/qisenum.h:53: Error:token is not a valid binary operator in a preprocessor subexpression
#    if __has_extension(is_enum)
    ~~~~~~~~~~~~~~~^

找不到解决方案,尽管我读到其他Mac用户似乎也有同样的问题。有人知道如何解决这个问题吗?

我已经找到了解决方案。只需从这里复制最新的 qisenum.h 文件并将其替换到Qt创建器安装clang_64/include/QtCore文件夹中,它就可以正常工作。

此问题已在此论坛帖子中解决。

这基本上是你的 clang 版本的问题

#    if __has_extension(is_enum)
         ~~~~~~~~~~~~~~~^

这是一个称为功能检查宏的 Clang 语言扩展。他们已经为Clang存在了很长时间。GCC从GCC 5.0开始提供它们,IIRC。

__has_extension可以作为预处理器宏进行测试。因此,您首先测试宏是否存在,然后测试该功能:

#if defined(__has_extension)
# if __has_extension(is_enum)
   ...
# endif
#endif

__has_extension(is_enum)必须位于单独的行上。

它也适用于包含文件。从 Crypto++ 项目创建一个 rdrand.cpp 文件:

# include <immintrin.h> // rdrand, MSC, ICC, and GCC
# if defined(__has_include)
#  if __has_include(<x86intrin.h>)
#   include <x86intrin.h> // rdseed for some compilers, like GCC
#  endif
# endif

在我的情况下,相同错误的原因是目标构建设置中的预处理器宏名称包含连字符符号"-",类似于 TEST-DEBUG=1。

带有连字符 ('-') 的 Xcode 构建配置名称会导致 Pod 构建失败

我的情况是:

#define USE_LIBICONV 1 # xxxxxx

错误

Token is not a valid binary operator in a preprocessor subexpression

溶液:

删除#define后的拼写错误注释

=> 将#更改为//

#define USE_LIBICONV 1 // xxxxxx

那么可以正常使用宏:

#if USE_LIBICONV
...
#endif