当编译时出现错误提示:"fopen': This function or variable may be unsafe."。

36

编译时我收到了这个错误:

'fopen': This function or variable may be unsafe. 
Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.

我是C++和OpenCV的新手,请帮我解决这个错误。

谢谢

void _setDestination(const char* name)
{
    if (name==NULL) {
        stream = stdout;
    }
    else {
        stream = fopen(name,"w");
        if (stream == NULL) {
            stream = stdout;
        }
    }
}
2个回答

99

这不是一个错误,而是来自于您的 Microsoft 编译器的警告。

选择您的项目并在上下文菜单中单击 "属性"。

在对话框中,选择 配置属性 -> C/C++ -> 预处理器

在 PreprocessorDefinitions 字段中添加 ;_CRT_SECURE_NO_WARNINGS 以关闭这些警告。


5
我不会禁用这个警告。相反,我会使用更安全的fopen版本,即fopen_s。有关详细信息,请参阅“CRT中的安全特性”(http://msdn.microsoft.com/en-us/library/8ef0s5kh.aspx)。 - Bogdan
10
@Bogdan,如果你只在使用Microsoft的话,那么这样做很好,但是这个是MS扩展而不是标准C ++。如果这是一个库或者项目的一部分,并且不是100%只使用Microsoft的话,你不应该使用_s扩展名,而应该依靠编写符合标准的好代码来代替。 - nvoigt
4
我不明白为什么要写一个额外的条件块来规避标准符合行为。条件块是用于在平台之间发生变化且不在标准中的事物。这不是。这是标准的 C 和 C++。 - nvoigt
2
OP没有将符合标准的行为作为要求。我只是提供了一个修复所述错误的选项。 - Zaw Lin
3
@nvoigt,使用Visual Studio 2013时,默认项目配置确实会生成编译错误,而不再像Visual Studio 2012之前那样只是一个警告。 - Étienne
显示剩余4条评论

25

这是一条通常的警告。你可以通过

#pragma warning(disable:4996)

或者就像 Microsoft 所意图的那样,简单地使用 fopen_s。

但一定要在其他头文件之前使用 pragma。


3
因为它是4996而不是4496。 - eoleary
3
无法在VS2017中工作。 - Patapoom
对我来说,在VS2017中可以工作。 - trueCamelType

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接