sprintf_s未在此范围内声明

时间:2011-01-28 12:31:25

标签: c linux tr24731

我有一个使用sprintf_s的C程序。它在Windows中运行良好,但是当我在Linux中编译代码时,它会出现此错误:

sprintf_s was not declared in this scope.

为什么会发生这种情况,我该如何解决?

6 个答案:

答案 0 :(得分:29)

这不是标准,你不会在Linux上找到这样的功能。

标准函数snprintf应具有类似的语义。

答案 1 :(得分:7)

sprintf_s不是标准C库的一部分,因此它不可移植,因此您无法在Linux中使用它。 但是你有snprintf,它非常相似,它可以帮助你完成你想要的。

答案 2 :(得分:6)

sprintf_s不是标准C库的一部分,您无法在Linux中使用它。

但是,snprintf是标准的,应该执行相同的任务。

答案 3 :(得分:4)

sprintf_s只是附件K的一部分,是C11标准的可选附件

  

附件K

     

...

     

K.2范围

     
      
  1. 本附件指定了一系列 可选 扩展,可用于缓解   程序中的安全漏洞,包括新功能,宏和类型   在现有标准标题中声明或定义。
  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,它是核心标准的一部分,并提供您需要的所有功能。

答案 4 :(得分:1)

snprintf不安全,只有sprintf_s是安全的。 snprintf不保证添加最终的\ 0,导致可能的后续溢出。 请查看https://github.com/rurban/safeclib以获得正确的实施。

答案 5 :(得分:0)

在我的程序从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;
}