【问题标题】:Getting an error "fopen': This function or variable may be unsafe." when compling [duplicate]收到错误“fopen”:此函数或变量可能不安全。”编译时[重复]
【发布时间】:2014-02-19 06:45:26
【问题描述】:

编译时收到此错误:

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

我是 C++ 新手并打开 CV,因此请帮助我摆脱这个错误。

谢谢

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

【问题讨论】:

    标签: c++ opencv fopen


    【解决方案1】:

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

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

    在对话框中,选择Configuration Properties -> C/C++ -> Preprocessor

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

    【讨论】:

    • 我不会禁用此警告。取而代之的是,我会使用更安全的 fopen 版本,这意味着 fopen_s。详情请见'Security Features in the CRT'
    • @Bogdan 是的,如果您只是 Microsoft,那很好,但这是一个 MS 扩展,而不是标准 C++。如果这是一个库或不是 100% 仅限 Microsoft 的项目的一部分,则不应使用 _s 扩展,而应依赖编写符合标准的良好代码。
    • 我不明白为什么要编写额外的条件块来规避符合标准的行为。条件块用于从平台到平台发生变化并且不在标准中的事物。这不是。这是标准的 C 和 C++。
    • op 没有指定符合标准的行为作为要求。我只是提供了一个选项来修复上述错误。
    • @nvoigt 对于 Visual Studio 2013,它确实会在默认项目配置下生成编译错误,而不是在 Visual Studio 2012 之前出现警告。
    【解决方案2】:

    这是平时的警告。您可以通过

    禁用它
    #pragma warning(disable:4996)
    

    或者像微软打算的那样简单地使用 fopen_s。

    但请务必在其他标题之前使用 pragma。

    【讨论】:

    • 那是因为它是 4996 而不是 4496
    • 不适用于 VS2017
    • 为我在 VS2017 中工作
    猜你喜欢
    • 2019-11-27
    • 2012-11-13
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    相关资源
    最近更新 更多