如何将特定警告视为 C++ 中的错误以实现跨平台?

How to treat specific warnings as errors in c++ to be cross-platform?

我需要将一些特定的警告视为错误,以确保程序 运行 正常运行。例如带有 [[nodiscard]] 属性的函数应该总是 return,否则编译器会打印错误。在 Visual Studio (MSVC) 中,很容易做到这一点:

#pragma warning (error: warning_id)

这非常有效。但是我 运行 集群上的这段代码,我在其中使用 GCC、Clang 或 Intel 编译器,所以我想将其实现为可移植的。类似于:

#if defined(_MSC_VER)
    #pragma warning (error: 4834)
#elif defined(__GNUC__)
    // what here?
#elif defined(__clang__)
    // what to put here?
#else
    // another compiler...
#endif

我想 Intel 类似于 MSVC;在 Clang 中,有一个选项可以将错误视为警告 -Wno-error=some_error,这对我有帮助,但警告可能太多,我宁愿不将其视为错误。

有人可以帮忙吗?

对于 GCC 和 clang,将特定警告提升为错误的 #pragma 非常相似。

对于海湾合作委员会:

#pragma GCC diagnostic error "-Wunused-result"

叮当声:

#pragma clang diagnostic error "-Wunused-result"

Intel C/C++ 编译器确实支持 MSVC-style #pragma(并且它还定义了 _MSC_VER 宏,因此您可以使用相同的 #if defined... 块)。

对于“其他”编译器,这显然很难说——您需要查看您可能使用的每个编译器的手册。据我所知,没有 standard (cross-platform) 方法可以做到这一点。另请注意,仅仅因为编译器 pre-defines _MSC_VER 宏,并不能 保证 它也将支持所有 MSVC-style #pragma语法。