vsnprintf和gcc

Mir*_*pas 0 c c++ printf gcc

我有以下声明:

vsnprintf(target, size - 1, "%ls_%ls", str16_1, str16_2);
Run Code Online (Sandbox Code Playgroud)

为什么这会在gcc上失败?

我在Windows上使用过这样的:

vsnprintf(target, size - 1, "%S_%S", str16_1, str16_2);
Run Code Online (Sandbox Code Playgroud)

它按预期工作.在gcc文档中我发现%S是%ls的同义词,但我不能使用它.我也试过%S,但是没有用.我在具有可变参数列表的函数中使用它.是否可能无法工作,因为我更改了传递给va_start的格式变量?我必须搜索%S并将其替换为格式变量中的%ls.

功能如下:

void f(const char* format, ...){
  char* new_format = format with %S replaced with %ls;
  va_list argptr;
  va_start(args, format);
  vsnprintf(str, size-1, new_format, argptr);
}
Run Code Online (Sandbox Code Playgroud)

我查了一下,new_format是正确的.

谢谢!

Joe*_*e D 8

尝试使用snprintf,原因是vsnprintf.vsnprintf采用类型的参数va_list,而不是文字的可变参数列表.例如:

va_list ap;
va_start (ap, first_arg_in_this_function);
vsnprintf (buf, size, format_str, ap);
va_end (ap);
Run Code Online (Sandbox Code Playgroud)

而sprintf:

snprintf (buf, size, format_str, x, y);
Run Code Online (Sandbox Code Playgroud)

使用v*printf时......

  1. 围绕printf样式函数制作包装器
  2. Variadic宏不是一种选择

否则只需使用 *printf

  • @Felics:Joe D指出的基本问题是你传递了错误的参数.您传递的似乎是两个字符串(某种形式或其他形式),而不是va_list. (3认同)