2

我正在将一个win32应用程序移植到linux,而不是在每个_snprintf_s周围都有一堆#ifdefs,我想知道是否有办法#define它以某种方式snprintf。

所以像 -

#define _snprintf_s(1,2,3,4,5) snprintf(1,2,4,5)

snprintf 不存在第三个参数、要存储的最大字符数或 _TRUNCATE。

这种方法对吗?我可以做这样的#define吗?如果是这样,有人可以指出我应该怎么做吗?

我通过这个问题知道我必须小心这样的#defines。

谢谢!

4

2 回答 2

5

#define _snprintf_s(a,b,c,...) snprintf(a,b,__VA_ARGS__)

于 2012-09-14T18:55:04.443 回答
5

_snprintf_s()您可以将其实现为函数,而不是宏。这个简单(未经测试)的版本不执行_snprintf_s()应该执行的运行时错误处理(如果需要/需要,您可以添加它),但它尝试处理count参数强加的差异和截断时的返回值:

#include <assert.h>
#include <stdarg.h>
#include <stdio.h>
#include <string.h>

#if !defined(_TRUNCATE)
#define _TRUNCATE ((size_t)-1)
#endif

int _snprintf_s(
   char *buffer,
   size_t sizeOfBuffer,
   size_t count,
   const char *format,
   ... 
)
{
    int retval;
    va_list ap;

    if ((count != _TRUNCATE) && (count < sizeOfBuffer)) {
        sizeOfBuffer = count;
    }

    va_start(ap, format);
    retval = vsnprintf(buffer, sizeOfBuffer, format, ap);
    va_end(ap);

    if ((0 <= retval) && (sizeOfBuffer <= (size_t) retval)) {
        retval = -1;
    }

    return retval;
}

(为什么首先是参数列表中count_snprintf_s()参数?)

于 2012-09-14T20:48:52.077 回答