如何使用 va_lists 独立格式化 C 字符串平台?

Posted

技术标签:

【中文标题】如何使用 va_lists 独立格式化 C 字符串平台?【英文标题】:How to format a C-string platform independently with va_lists? 【发布时间】:2018-01-15 14:32:46 【问题描述】:

如果我在 VS2015 上编译包含 vsnprintf 的代码,它会抱怨:

warning C4996: 'vsnprintf': This function or variable may be unsafe.  
               Consider using vsnprintf_s instead.

如果我使用vsnprintf_s,则 gcc 无法编译它。

如何解决这个问题?我想在没有(抑制的)警告和平台无关的情况下编译代码。

无法使用 C++ 流,因为 va_list 和格式字符串是在 C 代码中创建的。

【问题讨论】:

写你自己的 vsnprintf 实现?或者,我认为你应该关闭警告(你会从 memcpy 之类的东西中得到它)。 这只是微软警告你,你不忠并考虑其他平台。他们的意见,不是我的。 @YSC 它在某种 c 包装代码中。所以使用流不是一个有效的解决方案,因为格式字符串和可变参数来自 c-world 注意Do you use the TR-24731 "safe" functions? - 特别是我的回答,指出vsnprintf_s()vsnprintf() 之间的差异是显着的。它还指出,在现代 MS Visual Studio 中,vsnprintf()_vsnprintf() 不同。最简单的是抑制来自 MS 的警告并使用(标准)vsnprintf() 我很乐意收到关于我的回答的反馈,亲爱的 OP。 【参考方案1】:

好吧,编写特定于 MS 的代码:

#ifndef _MSC_VER
#define vsnprintf_s(buf, size, count, format, list) std::vsnprintf(buf, size, format, list)
#endif // _MSC_VER

char buf[64];
vsnprintf_s(buf, sizeof(buf), _TRUNCATE, "%s...", valist);

【讨论】:

甚至不必是#define @peterchen 我不愿意定义一个名为 vsnprintf_s 的 C++ 标识符,以防万一发行版在其 C++ 实现中定义它。但你是对的。

以上是关于如何使用 va_lists 独立格式化 C 字符串平台?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 va_list 传递给 wsprintfW()?

[C]va_list可变长参数的使用

va_list 在 C 和 C++ 之间是不是不兼容? [关闭]

C语言va_list变量_printf

C语言中如何实现可变参函数

C语言特殊函数的应用