¿Cómo usar__VA_ARGS__ dentro de una función C en lugar de una macro?
(4)
Cada una de las funciones ?printf
tiene una función v?printf
correspondiente que hace lo mismo pero toma una va_list
, una lista de argumentos variables.
#include <stdio.h>
#include <stdarg.h>
void COMMON_Print(char *format, ...)
{
va_list args;
va_start(args, format);
vprintf(format, args);
va_end(args);
}
Nota al va_start
: observe que va_start
toma el nombre del último argumento antes del ...
como parámetro. va_start
es una macro que hace algo de magia basada en la pila para recuperar los argumentos variables y necesita la dirección del último argumento fijo para hacer esto.
Como consecuencia de esto, tiene que haber al menos un argumento fijo para que pueda pasarlo a va_start
. Esta es la razón por la que agregué el argumento de format
en lugar de seguir con la declaración COMMON_Print(...)
más simple.
Consulte: http://www.cplusplus.com/reference/clibrary/cstdio/vprintf/
Posible duplicado:
C / C ++: Pasando el número variable de argumentos alrededor
Actualmente estoy usando la siguiente macro declarada en mi archivo C.
#define COMMON_Print(...) printf (__VA_ARGS__)
Ahora esa llamada funciona bien, pero resulta que necesito poder crear una función C que se parece a esto:
void COMMON_Print(...)
{
printf (__VA_ARGS__);
}
Así que esa función no funciona, me sale un error.
"Error: identificador no definido __VA_ARGS__"
La complejidad de mi proyecto requiere tener una función ya que es una interfaz ... Entonces, ¿cómo puedo obtener los parámetros ... y pasarlos a la función printf? O mejor, ¿qué estoy haciendo mal?
¡Gracias!
Lo que estás buscando es el operador Ellipsis .
__VA_ARGS__
es solo para macros.
El encadenamiento del número variable de argumento a otra función no se puede hacer directamente. En su lugar, debe pasar una va_list, y la función que está llamando tiene que tomar una va_list. Afortunadamente hay una variación de printf que hace esto, tu función debe escribirse de esta manera:
void COMMON_Print(char *format,...)
{
va_list args;
va_begin(args,format);
vsprintf(format,args);
va_end(args);
}
__VA_ARGS__
es solo para macros; Las funciones variad son bastante diferentes. va_start
usar va_start
, va_arg
y va_end
de stdarg.h
para manejarlos.
Primero, su función necesita al menos un parámetro con nombre, por ejemplo:
void COMMON_Print(const char* fmt, ...)
Luego puede definir una va_list
y usar va_start
para establecerla:
va_list args;
va_start(args, fmt);
// your code here
va_end(args);
Ahora puedes usar args
para acceder a los argumentos; llamar a va_arg(args, TYPE)
devolverá el siguiente argumento variadic, así que puedes seguir llamando hasta que hayas leído todos los argumentos.
Si solo está tratando de llamar a printf
, hay una variante de printf llamada vprintf
que toma la lista va_list
directamente:
vprintf(fmt, args);
No hay una manera fácil de llamar a una función variable desde otra; Necesitas algo como vprintf
que toma toda la lista va_list