C sprintf_s()隐式声明警告
我有一个C代码,其中有一行C sprintf_s()隐式声明警告,c,c11,tr24731,C,C11,Tr24731,我有一个C代码,其中有一行 sprintf_s(var, outfile_ppm, local_filecounter++); 这里,var是char*类型,local\u filecounter是int类型 当我运行代码时,它会给我以下警告: 警告:C99[-Wimplicit函数声明]中函数“sprintf_s”的隐式声明无效 这个警告是什么?我如何消除它?sprintf_s功能是附录K/TR 24731边界检查接口的一部分。但是,任何对这些接口感兴趣的人都应该阅读。以下是摘录: 尽管从最
sprintf_s(var, outfile_ppm, local_filecounter++);
这里,var
是char*
类型,local\u filecounter
是int
类型
当我运行代码时,它会给我以下警告:
警告:C99[-Wimplicit函数声明]中函数“sprintf_s”的隐式声明无效
这个警告是什么?我如何消除它?sprintf_s功能是附录K/TR 24731边界检查接口的一部分。但是,任何对这些接口感兴趣的人都应该阅读。以下是摘录: 尽管从最初的提案开始已有十多年的时间,从批准ISO/IEC TR 24731-1:2007开始已有近十年的时间,从将边界检查接口引入C标准开始已有近五年的时间,但还没有出现可行的一致性实现。API仍然存在争议,实施者继续拒绝实施请求 事实上,如果您查看以下内容,您将看到(添加了强调): 边界检查(附件K)[可选]:图书馆问题(未实施) 附录K(
sprintf\u s
和其他类似的\u s
版本的函数)的唯一主要实现是在Visual Studio中。给出的流行解释是,这些函数由Microsoft内部在其自己的代码库中使用,以解决安全问题
其他实现依靠Valgrind、mudflap、address sanitizer等工具来解决相同的问题,而Microsoft以外的代码库很少实际使用这些函数,因此实现它们的动机很低
换句话说,如果您不使用VisualStudio,就不能使用这些函数。幸运的是,它们不是必需的
问题中的sprintf_s
调用一开始就非常可疑
// Wait, what? Something smells fishy...
sprintf_s(var, outfile_ppm, local_filecounter++);
sprintf\u s
的第三个参数应该是一个格式字符串,但是local\u filecounter++
看起来太可疑了,不可能是格式字符串
通常,您会使用snprintf
,它会截断其输出以适应缓冲区;如果您可以使用C标准之外的函数,则使用asprintf
char var[256];
snprintf(var, sizeof(var), outfile_ppm, localfile_counter++);
请注意,如果var
没有数组类型,则不能使用sizeof(var)
来计算其大小,通常关于数组在用作函数参数时衰减为指针的警告适用于此处
摘要:除非切换到Visual Studio或自己实现,否则不能使用sprintf\u s()
。硬饼干
小注:理论上,如果你想
sprintf\u
,你应该定义\u STDC\u WANT\u LIB\u EXT1\u
。然而,实际上,据我所知,唯一定义sprintf_s
的主要实现是这样做的,而不管宏是否存在。事情可能已经发生了变化。“我怎样才能摆脱它?”——>不要使用sprintf\u s()
发布似乎需要它的代码以查看替代方案。这个sprintf\u s
函数是什么?您从哪里获得的?包括正确的标题,警告就会消失。@DietrichEpp不需要\define\uu STDC\u WANT\u LIB\u EXT1\uuuu1
也在那里吗?标准C99没有sprintf\u s()
。C11可能包括它。其他版本可能将其作为某种形式的扩展。@AnttiHaapala:根据标准,是的。但是,我不知道宏实际具有这种效果的任何实现。