繁体   English   中英

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

[英]sprint_f macro in Linux for cross-platform application

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

大多数OS API \\ Microsoft非标准扩展函数可以轻松(或多或少......)替换为等效的Linux \\ GCC API,但是,我不知道如何处理sprintf_s,它获取可变数量的参数。

有没有人有想法(如果你可以请那么代码示例)?

谢谢大家。

首先,您可以将代码移植到使用C ++ iostreams(例如ostringstream )吗? 这将完全消除sprintf函数行的所有可能问题,如果有少量的调用点可能是最好的选择。

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

最好的替代品是snprintf ,与sprintf_s相比确实存在局限性。 它不会进行格式字符串验证。 并非所有版本都保证最终字符串将以空值终止:您始终希望在调用后将空值存储到缓冲区的最后一个字符中,以确保最终字符串为空终止。

添加到头文件的末尾或源文件的开头:

#ifndef _WIN32
    #define sprintf_s(dest,len,format,...) sprintf(dest,format,__VA_ARGS__)
#endif

snprintf具有相同的签名,但AFAIK的行为略有不同。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM