c

¿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