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

Qan*_*123 4 c++ preprocessor compiler-errors pragma compiler-warnings

我需要将一些特定的警告视为错误,以确保程序按预期运行。例如,具有该[[nodiscard]]属性的函数应始终返回,否则编译器会打印错误。在 Visual Studio (MSVC) 中,可以很容易地通过以下方式做到这一点:

#pragma warning (error: warning_id)
Run Code Online (Sandbox Code Playgroud)

这非常有效。但我在集群上运行此代码,使用 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
Run Code Online (Sandbox Code Playgroud)

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

我应该怎么办?

Adr*_*ica 6

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

\n

对于海湾合作委员会:

\n
#pragma GCC diagnostic error "-Wunused-result"\n
Run Code Online (Sandbox Code Playgroud)\n

对于叮当声:

\n
#pragma clang diagnostic error "-Wunused-result"\n
Run Code Online (Sandbox Code Playgroud)\n

正如您所假设的,英特尔 C/C++ 编译器确实支持 MSVC 样式#pragma(并且它还定义了_MSC_VER宏,因此您可以使用相同的#if defined...块)。

\n

对于“其他”编译器,显然很难说 \xe2\x80\x93 您需要检查您可能使用的每个编译器的手册。据我所知,没有标准(跨平台)方法可以做到这一点。另请注意,仅仅因为编译器预定义了_MSC_VER宏,并不能保证它也支持所有 MSVC 风格的#pragma语法。

\n