目前,我在 #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 中构建时处理此问题而不删除它?
任何指针都是令人鼓舞的..
最佳答案
Clang 使用不同的警告语法:
#pragma clang warning "I'm a warning"
您可以在发出编译指示之前禁用未知编译指示警告;类似的东西
#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 长度数组,如果支持,它们可能会也可能不会发出可以禁用的警告。我可以方便测试的:
- 不支持 0 长度数组:
- suncc
- PGCC (PGC-S-0047)
- 支持 0 长度数组,不发出警告
- TI cl6x
- 国际商会
- 支持 0 长度数组并在某些情况下发出警告
- GCC(-Wpedantic)
其他编译器可能支持类似的警告,并且许多编译器支持推送/弹出和禁用有关未知编译指示的警告。
关于c - ARM 的 LLVM 是否支持#pragma warning?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53469474/