如果我构建并运行一个项目,基本上是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