C sprintf_s()隐式声明警告

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边界检查接口的一部分。但是,任何对这些接口感兴趣的人都应该阅读。以下是摘录: 尽管从最

我有一个C代码,其中有一行

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:根据标准,是的。但是,我不知道宏实际具有这种效果的任何实现。