C++ 如何仅为函数调用而非全局禁用SCL安全警告?

C++ 如何仅为函数调用而非全局禁用SCL安全警告?,c++,visual-c++,C++,Visual C++,根据MSDN关于: 调用标准C++库中任何一个潜在的不安全方法将导致。要禁用此警告,请在代码中定义宏_SCL_SECURE_NO_警告: #define _SCL_SECURE_NO_WARNINGS 也可以禁用如下警告: #pragma warning(disable:4996) 但是。。。通过使用这些方法中的任何一种,您都可以禁用全局警告,我希望在本地执行此操作,例如: #pragma warning(disable:4996) some_string.copy(str, some_st

根据MSDN关于:

调用标准C++库中任何一个潜在的不安全方法将导致。要禁用此警告,请在代码中定义宏_SCL_SECURE_NO_警告:

#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: ...)
但您必须考虑到,如果警告的状态在默认情况下处于禁用状态,则不会将此类警告恢复为再次启用

对于Instance:设为默认禁用的警告

// 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.

参考资料:

MMMM我想知道为什么会投反对票。与
#pragma warning(disable:…)
最接近的是
#pragma warning(disable:…)
,尽管顾名思义,它实际上没有启用默认关闭的警告。@charlesbaily
#pragma warning(default:…)
没有完全删除对警告状态的任何修改?对不起,我不明白你的问题。@CharlesBailey我的错,你是对的,谢谢。只是想知道,
#undefine/code/#define
也能起作用吗?我想它会。。。让我try@Amadeus我试过你的想法,但我发现如果你不在任何代码行之前写
#define(定义)SCL(安全)(无)警告(/code>),它就不起作用了(哇!!??)。所以,这并不能解决问题。谢谢你的帮助try@Amadeus我之前的结论不太正确,似乎有些include语句没有给出
#define(定义)SCL(安全)NO(无)警告
一些方法。但我认为这是另一个问题。