如何使用 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 字符串平台?的主要内容,如果未能解决你的问题,请参考以下文章