目前,我在代码中对#pragma push()和#pragma pop()使用了#pragma警告,如下所示。当我使用Visual Studio编译器时,代码正在取得成功。
#pragma warning(push)
#pragma warning(disable: 4200) // zero-sized array
#pragma pack (push, 1)
...
...
#pragma pack (pop)
#pragma warning(pop)
但是当我尝试为LLVM编译器构建相同的代码时,它显示了 #pragma警告
如何在不删除LLVM的情况下处理该问题?
任何指针都令人鼓舞。.
答案 0 :(得分:0)
Clang对警告使用不同的语法:
#pragma clang warning "I'm a warning"
您可以在发出编译指示之前禁用unknow-pragmas警告;像
#if defined(__has_warning)
# if __has_warning("-Wunknown-pragmas")
# pragma clang diagnostic push
# pragma clang diagnostic ignored "-Wunknown-pragmas"
...
# pragma clang diagnostic pop
# endif
#endif
但是,实际测试MSVC会更聪明,只在其中编写编译指示…
#if defined(_MSC_VER)
# pragma warning(push)
# pragma warning(disable: 4200) // zero-sized array
# pragma pack (push, 1)
#endif /* defined(_MSC_VER) */
...
...
#if defined(_MSC_VER)
# pragma pack (pop)
# pragma warning(pop)
#endif
当然,clang也对零长度数组发出警告,并为压入/弹出错误堆栈提供了编译指示,因此您可能也希望包括这些内容……
#if defined(__clang__) && defined(__has_warning)
# if __has_warning("-Wzero-length-array")
# pragma clang diagnostic push
# pragma clang diagnostic ignored "-Wzero-length-array"
# endif
#elif defined(_MSC_VER)
# pragma warning(push)
# pragma warning(disable: 4200)
# pragma pack (push, 1)
#endif
// ...
#if defined(__clang__) && defined(__has_warning)
# if __has_warning("-Wzero-length-array")
# pragma clang diagnostic pop
# pragma clang warning "pop"
# endif
#elif defined(_MSC_VER)
# pragma pack (pop)
# pragma warning(pop)
#endif
FWIW,推送/弹出警告仅在MSVC 15以上版本中可用;我懒得检查何时支持该特定警告,但是如果您想支持较早的编译器,则可能要测试MSVC版本。
其他编译器可能根本不支持0长度数组,如果这样做,它们可能会或可能不会发出警告,可以将其禁用。我可以方便地测试的:
其他编译器可能也支持类似的警告,并且许多编译器支持推送/弹出和禁用有关未知编译指示的警告。