LLVM for ARM是否支持#pragma警告?

时间:2018-11-25 16:23:16

标签: 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的情况下处理该问题?

任何指针都令人鼓舞。.

1 个答案:

答案 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长度数组,如果这样做,它们可能会或可能不会发出警告,可以将其禁用。我可以方便地测试的:

  • 不支持0长度数组:
    • suncc
    • pgcc(PGC-S-0047)
  • 支持长度为0的数组,不发出警告
    • TI cl6x
    • ICC
  • 支持长度为0的数组,并在某些情况下发出警告
    • 海湾合作委员会(-Wpedantic)

其他编译器可能也支持类似的警告,并且许多编译器支持推送/弹出和禁用有关未知编译指示的警告。