按照 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_s
是fopen
的安全版本,因此如果您不想使用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 有啥错误?的主要内容,如果未能解决你的问题,请参考以下文章