c - ARM 的 LLVM 是否支持#pragma warning?

标签 c llvm-clang

目前,我在 #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/

相关文章:

c - 物理载波监听返回的数据存储在哪里?

cuda - 用clang编译CUDA

linux - 从 C 源文件生成 LLVM 位码文件的 CMakeList 文件

c++ - 有没有一种方法可以使用 Clang API 扩展宏来获取源代码

c - 如何等待线程完成工作,其中由c中的clone创建的线程?

C代码32位到64位类型转换

c - 将 SIGINT 发送到运行脚本的 forked exec 进程不会杀死它

c - 如何通过外部 IP 连接套接字 (Mac)

c++ - 使用简单模板时如何修复 CLANG 中的 "undefined symbol"

clang 不编译 c 程序?