gpt4 book ai didi

c - sprintf_s() 隐式声明警告

转载 作者:行者123 更新时间:2023-11-30 18:24:03 26 4
gpt4 key购买 nike

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

sprintf_s(var, outfile_ppm, local_filecounter++);

在这里,varchar*类型和 local_filecounterint类型。

当我运行代码时,它会给我这个警告:

warning: implicit declaration of function 'sprintf_s' is invalid in C99 [-Wimplicit-function-declaration]

这个警告是什么?如何消除它?

最佳答案

sprintf_s功能是附件 K/TR 24731 边界检查接口(interface)的一部分。但是,任何对这些接口(interface)感兴趣的人都应该阅读 N1967 Field Experience With Annex K — Bounds Checking Interfaces 。以下是摘录:

Despite more than a decade since the original proposal and nearly ten years since the ratification of ISO/IEC TR 24731-1:2007, and almost five years since the introduction of the Bounds checking interfaces into the C standard, no viable conforming implementations has emerged. The APIs continue to be controversial and requests for implementation continue to be rejected by implementers.

确实,如果你看看GCC C11 status page ,你会看到(添加了强调):

Bounds-checking (Annex K) [Optional]: Library issue (not implemented)

附件 K(sprintf_s 和其他类似的 _s 版本的函数)的唯一主要实现是在 Visual Studio 中。流行的解释是,这些函数由 Microsoft 在自己的代码库内部使用来解决安全问题。

其他实现依赖于 Valgrind、mudflap、地址清理器等工具来解决同一组问题,而 Microsoft 之外的代码库很少实际使用这些功能,因此实现它们的动力很小。

换句话说,如果您不使用Visual Studio,则无法使用这些功能。幸运的是,它们不是必需的。

调用sprintf_s这个问题一开始就非常可疑......

// Wait, what? Something smells fishy...
sprintf_s(var, outfile_ppm, local_filecounter++);

sprintf_s 的第三个参数应该是一个格式字符串,但是 local_filecounter++看起来太可疑了,不可能是格式字符串。

通常,您会使用 snprintf ,它截断其输出以适合缓冲区,或 asprintf如果您可以使用 C 标准之外的函数。

char var[256];
snprintf(var, sizeof(var), outfile_ppm, localfile_counter++);

请注意,如果 var没有您不能使用的数组类型 sizeof(var)计算其大小,以及有关数组用作函数参数时衰减为指针的常见警告适用于此处。

摘要:您不能使用sprintf_s()除非你切换到Visual Studio或者自己实现。坚硬的 cookies 。

小注意事项:理论上,您应该定义 __STDC_WANT_LIB_EXT1__如果你想要sprintf_s 。然而,在实践中,定义 sprintf_s 的唯一主要实现据我所知,无论宏是否存在,完全都会这样做。事情可能已经改变。

关于c - sprintf_s() 隐式声明警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45198063/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com