我有一个使用sprintf_s
. 它在 Windows 中运行良好,但是当我在 Linux 中编译我的代码时,它给出了这个错误:
sprintf_s was not declared in this scope.
为什么会发生这种情况,我该如何解决?
它不是标准的,你不会在 Linux 上找到这样的功能。
标准函数snprintf
应该具有类似的语义。
sprintf_s 不是标准 C 库的一部分,因此它不可移植,因此您无法在 Linux 中使用它。但是你有 snprintf,它非常相似,它应该可以帮助你完成你想要的。
sprintf_s
只是附件 K 的一部分,是 C11 标准的可选附件:
附件 K
...
K.2 范围
- 本附件规定了一系列可用于缓解程序安全漏洞的可选扩展,包括在现有标准头文件中声明或定义的新函数、宏和类型。
...
K.3.5.3.6 sprintf_s 函数
概要
#define __STDC_WANT_LIB_EXT1__1 #include <stdio.h> int sprintf_s(char * restrict s, rsize_t n, const char * restrict format, ...);
(重点补充)
它从未进入 POSIX(或 Linux)(并且根本没有被遗漏,甚至有关于它在委员会中有用性的争论)。
为了获得更好的可移植性,请使用snprintf
核心标准的一部分并提供您需要的所有功能。
sprintf_s
不是标准 C 库的一部分,您将无法在 Linux 中使用它。
但是,snprintf
这是标准的,应该做同样的任务。
在将我的程序从 Windows 移植到 Linux 期间,我在自己的 windows.h 中编写了以下实现:
inline int sprintf_s(char* buffer, size_t sizeOfBuffer, const char* format, ...)
{
va_list ap;
va_start(ap, format);
int result = vsnprintf(buffer, sizeOfBuffer, format, ap);
va_end(ap);
return result;
}
template<size_t sizeOfBuffer>
inline int sprintf_s(char (&buffer)[sizeOfBuffer], const char* format, ...)
{
va_list ap;
va_start(ap, format);
int result = vsnprintf(buffer, sizeOfBuffer, format, ap);
va_end(ap);
return result;
}
snprintf 是不安全的,只有 sprintf_s 是安全的。snprintf 不保证添加最终的 \0,从而导致可能的后续溢出。查看https://github.com/rurban/safeclib以获得正确的实施。