代码之家  ›  专栏  ›  技术社区  ›  rkellerm

用于跨平台应用程序的Linux中的sprint_f宏

  •  1
  • rkellerm  · 技术社区  · 14 年前

    我正在将现有的Windows应用程序移植到Linux。

    大多数OS APIs\Microsoft非标准扩展函数可以很容易地(或多或少…)被等效的Linux\GCC APIs替换,但是,我不知道如何处理具有可变参数数的sprintf_。

    有人对此有什么想法吗(如果你也能举个代码例子的话)?

    提前谢谢大家。

    5 回复  |  直到 9 年前
        1
  •  5
  •   Mark B    14 年前

    首先,您可以将您的代码仅使用C++ iOFIONS替代吗? ostringstream )?这将完全消除 sprintf 函数行,如果调用点数量有限,则可能是最佳选择。

    如果这不是一个选择: sprintf_s 函数基本上是防止错误(以及外部滥用导致缓冲区溢出)的助手。从 http://msdn.microsoft.com/en-us/library/ce3zzk1k%28VS.80%29.aspx 我们了解到它有两个功能:检查格式字符串的有效格式(这并不意味着它进行类型检查-它仍然不能这样做),并且允许指定最大长度。

    最好的替代品是 snprintf 短跑 . 它不会进行格式字符串验证。并非所有版本都保证最终字符串将以空结尾:您始终希望在调用后将空值存储到缓冲区的最后一个字符中,以确保最终字符串以空结尾。

        2
  •  0
  •   peoro    14 年前

    snprintf具有相同的签名,但afaik的行为方式略有不同。

        3
  •  0
  •   ROAR    14 年前

    sprintf是sprintf的“安全”版本(将缓冲区长度作为额外参数),您不能只为端口使用sprintf吗?

        4
  •  0
  •   BJovke    9 年前

    添加到头文件结尾或源文件开头:

    #ifndef _WIN32
        #define sprintf_s(dest,len,format,...) sprintf(dest,format,__VA_ARGS__)
    #endif
    
        5
  •  -1
  •   Bukes    14 年前

    为什么不为Linux提供sprintf_的有条件编译的实现呢?这个实现可以简单地忽略额外的参数并调用Sprintf()。