如何禁用SCL SECURE WARNING仅为一个函数调用,而不是全局

How disable SCL SECURE WARNING just for a function call and not globaly?

本文关键字:函数调用 一个 全局 SECURE SCL 何禁用 WARNING      更新时间:2023-10-16

根据MSDN关于_SCL_SECURE_NO_WARNINGS:

调用标准c++库中任何一个可能不安全的方法将导致编译器警告(级别3)C4996。要禁用此警告,请在代码中定义宏_SCL_SECURE_NO_WARNINGS:

#define _SCL_SECURE_NO_WARNINGS

也可以像这样禁用警告:

#pragma warning(disable:4996)

但是…通过使用这些方法中的任何一种,您都可以禁用全局警告,我想在本地禁用,例如:

#pragma warning(disable:4996)
some_string.copy(str, some_string.length());
// #pragma warning(enable:4996)   There is something outhere like this?

那里有类似上面代码的东西吗?

使用语法

#pragma warning( push )  // Stores the current warning state for every warning.
#pragma warning( pop )   // pops the last warning state pushed onto the 
                         // stack. Any changes that you made to the warning
                         // state between push and pop are undone.

可以修改和恢复本地警告配置。

因此,按照问题的示例,您可以禁用然后再次启用警告:

#pragma warning(push)                // save the warning conf status.
#pragma warning(disable:4996)        // disable specific warning.
// ...                               // you could disable more than one.
target.copy(str, target.length());   // call 
#pragma warning(pop)                 // restore previous warning conf.

正如Charles Bailey在评论中指出的,你也可以使用:

#pragma warning(default: ...)

但是你必须考虑到如果警告的状态在默认情况下是禁用的,这将不会恢复这种警告再次启用。

例如:默认禁用警告。

// At this point n was enabled.
#pragma warning(disable:n)
// ... some code here
#pragma warning(default:n)   
// n remains disabled. Maybe not what you want.

参考:MSDN警告