按照 Visual Studio 的建议,使用 fopen 而不是 fopen_s 有啥错误?

Posted

技术标签:

【中文标题】按照 Visual Studio 的建议,使用 fopen 而不是 fopen_s 有啥错误?【英文标题】:What is the error in using fopen instead of fopen_s as suggested by Visual Studio?按照 Visual Studio 的建议,使用 fopen 而不是 fopen_s 有什么错误? 【发布时间】:2017-04-01 15:05:11 【问题描述】:

我开始为游乐园编写 OpenGL 代码。但我收到以下错误:

"error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."

即使我尝试将其从 fopen 更改为 fopen_s,也会出现更多错误。

这是代码部分:

GLuint LoadBMP(const char *fileName)

    FILE *file;
    unsigned char header[54], *data;
    unsigned int dataPos, size, width, height;
    file = fopen(fileName, "rb");
    fread(header, 1, 54, file);             //Windows BMP begin with 54 byte header
    dataPos = *(int*)&(header[0x0A]);   //dec10, Actual BMP data
    size = *(int*)&(header[0x22]);  //dec34, BMP Size
    width = *(int*)&(header[0x12]); //dec18, Image Width
    height = *(int*)&(header[0x16]);    //dec22, Image Height
    if (size == NULL)
        size = width * height * 3;
    if (dataPos == NULL)
        dataPos = 54;
    data = new unsigned char[size];
    fread(data, 1, size, file);
    fclose(file);
    GLuint texture;
    glGenTextures(1, &texture);             //Generate (allocate) 1 texture name
    glBindTexture(GL_TEXTURE_2D, texture);  //Bind the 2D texture

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);  //MAG filter
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);  //MIN filter

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, data); //target, level, internalFormat, width, height,border, format, type, data 
    return texture;

file = fopen 语句中出现错误。

帮我找出其中的错误。

【问题讨论】:

那行代码没有问题。显然你正在使用一些编译器设置,将警告变成错误,这反过来又让微软的偏执狂控制了你编写代码的方式。 2 个选择:(1) 定义宏,如错误消息中所示;或 (2) 向我们展示您使用 fopen_s 得到的错误(注意它采用不同的参数并返回错误代码)。 @PeteBecker fopen_s 是 C11 @RichardCritten -- 警告/错误是微软。 在开始在 C++ 中使用 *_s 函数之前,您可能需要考虑 C document N1967 提议将其从下一个 C 标准中删除。 【参考方案1】:

fopen_sfopen 的安全版本,因此如果您不想使用fopen_s,请考虑使用_CRT_SECURE_NO_WARNINGS 来消除该错误,因为您使用的是Visual Studio。

现在如果你想使用fopen_s来纠正错误,你必须看看the documentation of fopen_s

使用示例:

errno_t returnValue = fopen_s(&file, fileName, "r");

【讨论】:

可能更准确地说fopen_s() 是微软尝试embrace, extend, and extinguish 可移植C 代码的一部分(这些是微软自己关于如何占领市场的术语......)。使用fopen_s() 不会使您的代码更安全,但会降低您的代码的可移植性。见N1967 - Field Experience With Annex K — Bounds Checking Interfaces

以上是关于按照 Visual Studio 的建议,使用 fopen 而不是 fopen_s 有啥错误?的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2015 命令窗口建议文本截断

Visual Studio .exe 文件打开并立即关闭

Visual Studio调试效率技巧

如何用visual studio2012编c++程序?

在 Visual Studio Code 中使用建议的方法参数

Visual Studio 2022 关闭灰色建议