如何将特定警告视为 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
语法。
我需要将一些特定的警告视为错误,以确保程序 运行 正常运行。例如带有 [[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
语法。