C++中是否存在标准化的弃用警告抑制方法?
问题背景与需求
自C14起,标准化的[[deprecated]]属性可用于标记类、函数、变量等为已弃用,所有合规编译器都应触发弃用警告;C14之前只能通过编译器专属的pragma实现类似功能。
现在需要在特定代码位置/区域使用已弃用内容,但要抑制对应的弃用警告(比如编译器开启了“警告视为错误”的设置)。已知以下编译器专属的实现方式:
GCC 专属方式
#pragma GCC diagnostic ignored "-Wdeprecated-declarations" #pragma GCC diagnostic warning "-Wdeprecated-declarations"
Visual Studio 专属方式
__pragma(warning(push)) __pragma(warning(disable:4996)) __pragma(warning(pop))
请问是否存在标准化的弃用警告抑制方式?还是必须为每个支持的编译器编写特定pragma?希望能摆脱这类编译器专属宏。
以下是GCC环境下的示例代码:
#include <iostream> #define BEGIN_IGNORE() _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") #define END_IGNORE() _Pragma("GCC diagnostic warning \"-Wdeprecated-declarations\"") [[deprecated]] void old_foo() { std::cout << "Better don't use this anymore\n"; } int main() { // 必须使用该函数,但不想触发编译器警告 BEGIN_IGNORE(); old_foo(); END_IGNORE(); }
解答
目前C标准(包括C20、C++23)中没有提供标准化的弃用警告抑制语法,你必须针对不同编译器使用对应的专属pragma来实现需求。
不过可以通过封装跨平台宏的方式,把编译器专属逻辑隐藏起来,避免在业务代码中重复编写不同编译器的pragma:
#include <iostream> #if defined(__GNUC__) || defined(__clang__) #define BEGIN_IGNORE_DEPRECATED() _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") #define END_IGNORE_DEPRECATED() _Pragma("GCC diagnostic warning \"-Wdeprecated-declarations\"") #elif defined(_MSC_VER) #define BEGIN_IGNORE_DEPRECATED() __pragma(warning(push)) __pragma(warning(disable:4996)) #define END_IGNORE_DEPRECATED() __pragma(warning(pop)) #else // 其他编译器默认不做处理,或根据需要添加适配逻辑 #define BEGIN_IGNORE_DEPRECATED() #define END_IGNORE_DEPRECATED() #endif [[deprecated]] void old_foo() { std::cout << "最好别再用这个函数了\n"; } int main() { BEGIN_IGNORE_DEPRECATED(); old_foo(); END_IGNORE_DEPRECATED(); }
这种方式既满足了跨平台需求,又不用在业务代码中直接编写编译器专属的pragma,算是当前最优的折中方案。
内容的提问来源于stack exchange,提问作者Thibe
相关产品推荐
相关产品推荐

