Pregunta
¿Hay alguna manera de pasar muchos argumentos a MyPrint() a continuación usando algún tipo de matriz que contenga una lista de punteros a cadenas que va_start() entiende antes de llamar a vsnprintf() ?
Ejemplo de un especificador de cadena de formato. Sería bueno crear una matriz de los valores correspondientes y pasarla a MyPrint() en lugar de pasar cada argumento individualmente. No sé si es posible que va_start() lo entienda. :(
"[0x%llX][%u] %s --- A=%llu (0x%llX) B=%llu (0x%llX) C=%llu (0x%llX) X=%llu (0x%llX) Y=%llu (0x%llX) Z=%llu (0x%llX)"Detalles
MyPrint() llama a vsnprintf(), que imprime una lista formateada de argumentos en una matriz de caracteres. La declaración de vsnprintf() se muestra a continuación:
int vsnprintf(char *arr, size_t len, const wchar_t *format, va_list args);Parámetros
#include <stdio.h> #include <stdarg.h> int MyPrint(char* buffer, int bufferSize, const char *format, ...) { int len = 0; va_list arguments; va_start(arguments, format); len = vsnprintf(buffer, bufferSize, format, arguments); va_end(arguments); return len; } int main() { char buffer[256]; MyPrint(buffer, 256, "%s %s","Hello","World"); printf("%s",buffer); return 0; }¿Hay alguna manera de pasar muchos argumentos a MyPrint() a continuación usando algún tipo de matriz que contenga una lista de punteros a cadenas que va_start() entiende antes de llamar a
vsnprintf()?
Las únicas formas definidas de inicializar una va_list , como vsnprintf() requiere como parámetro, son
a través de la macro va_start() , que opera en el contexto de una función variable para formar una va_list a partir de los argumentos variables de la función, y
a través de la macro va_copy() , para hacer una copia de otra va_list .
No hay ningún mecanismo en C estándar para formar una va_list a partir de los elementos de una matriz, excepto pasándolos todos, individualmente , a una función variádica.
Las funciones variádicas tienen que ver con la flexibilidad de codificación, no con la flexibilidad de datos. Si desea una función que maneje matrices de datos, escriba una (no variádica) que lo haga.
Cada vez que consideres escribir tu propia función varargs, golpéate en la cabeza y repite el mantra: "varargs no es la respuesta". Solo si todavía tiene varargs en su cabeza después de algunas iteraciones, debería considerar investigar esa opción.