关于C#:#define _snprintf_s到snprintf

#define _snprintf_s to snprintf

我正在将win32应用程序移植到linux,而不是每个_snprintf_s周围都没有#ifdef,而是想知道是否有一种方法可以将其以某种方式将其定义为snprintf。

类似-

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

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

这种方法正确吗?我可以这样定义吗?
如果是这样,有人可以指出我该怎么做吗?

我经历了这个问题,知道我必须对此类#defines保持谨慎。

谢谢!


您可以代替功能来实现_snprintf_s()。这个简单的(未经测试的)版本不会执行_snprintf_s()应该执行的运行时错误处理(如果需要/需要,可以添加该错误),但是它会尝试处理count参数和截断时返回值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include
#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()参数列表中?)


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