【发布时间】:2020-05-31 09:18:00
【问题描述】:
我正在使用 snprintf 将输出发送到缓冲区。使用 C++ 11 并用于桌面应用程序。
到目前为止,我只为 Windows 做这件事。但从现在开始,它必须支持不同的平台(Windows、Linux 和 Mac)
为了支持多平台,我打算写一个带有#if标签的包装函数。
但在这里我面临的挑战是,当从项目的不同位置调用 WrapperSprintf 时,参数的数量是不同的。
如何编写一个通用的包装器,可以在不同的地方使用不同的参数传递给 WrapperSprintf 函数?
我尝试了如下所示的包装函数。请帮助我如何继续:
void WrapperSprintf( char buffer, const char *format, ... )
{
#if defined(_WIN32)
_snprintf_s(buffer, sizeof(buffer), format,...);
#else
snprintf(buffer, sizeof(buffer), format, ...);
#endif
}
调用 WrapperSprintf 函数1:
char m_systemTime[20];
char* CUPSManager ::getSystemTime()
{
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );
WrapperSprintf(m_systemTime,"%d-%d-%d :%d:%d:%d" , timeinfo ->tm_year +1900,
timeinfo ->tm_mon +1,
timeinfo->tm_mday,
timeinfo->tm_hour,
timeinfo->tm_min,
timeinfo->tm_sec);
return m_systemTime;
}
调用 WrapperSprintf 函数2:
void getDevicePath()
{
wstring strDevPath;
strDevPath = (LPCWSTR)cDevicePath;
char cDevPath[2048];
WrapperSprintf(cDevPath,"%ls", strDevPath.c_str());
int nPathLength = strlen(cDevPath);
...
}
【问题讨论】:
-
为什么需要一个包装器呢? MSVC 似乎支持
snprintf而没有_。 (并且_snprintf不太安全;如果缓冲区不够长,它不会以空值终止字符串。) -
查看
va_list,这是 C 捕获省略号的方式 (...)。但是,为什么不使用 C++? -
snprintf是标准 C++ 函数。为什么你需要一个包装器? -
这看起来像 C 代码。不是惯用的 C++ 代码。
-
@bolov
snprintf()(带有 n)是在 C++11 和/或 C99 中添加的。在此之前,它的实施并不标准。在编写可移植代码时,经常会看到配置检查以查看它是否以当前语言定义(因为它并不总是存在)。