c variadic-functions

variadic arguments c++



Pasar una elipsis a otra funciĆ³n variadic (4)

No puedes, solo puedes pasar los argumentos como va_list . Vea las preguntas frecuentes de comp.lang.c.

En general, si está escribiendo funciones variables (es decir, funciones que toman un número variable de argumentos) en C, debe escribir dos versiones de cada función: una que toma puntos suspensivos ( ... ) y otra que toma una va_list . La versión que toma puntos suspensivos debe llamar a va_start , llamar a la versión a tomar va_list , llamar a va_end y regresar. No hay necesidad de duplicar el código entre las dos versiones de la función, ya que una llama a la otra.

Esta pregunta ya tiene una respuesta aquí:

Tengo aproximadamente 30 funciones variadicas. Cada uno acepta un camino como el argumento final, por ejemplo:

bool do_foo(struct *f, int q, const char *fmt, ...)

En cada función, tengo que verificar que el formato expandido sea menor o igual a un tamaño determinado. Por lo tanto, me encuentro copiando / pegando el mismo fragmento de código para verificar cuántos caracteres vsnprintf() no imprimió, configuró errno consecuencia y salí de la escritura.

Lo que me gustaría hacer es escribir una función para hacer esto, que devolvería una cadena asignada estáticamente (expandida) que se sabe que es un tamaño seguro, o una cadena recién iniciada en caso de error, que podría compararse con NULL. Las verificaciones también tienen que determinar si la cadena es una ruta absoluta o relativa, lo que influye en el tamaño seguro de la cadena. Es un montón de código duplicado y está empezando a oler.

¿Hay alguna manera de que pueda pasar el contenido de la elipsis de la entrada de mi función a otra función? ¿O tengo que llamar va_start() a va_start() y luego pasar la va_list a la función auxiliar?

Editar:

No me opongo en absoluto a pasarle la lista va_list al ayudante, solo quería asegurarme de que no existía nada más. Me parece que el compilador entiende dónde comienzan los argumentos variad, así que solo tenía curiosidad por poder decirles que los transmitiera.


No sé si esto ayudará, puede acceder a las variables por referencia. Este es un tipo de truco, pero desafortunadamente no te permitirá usar puntos suspensivos en la definición de la función final.

#include <stdio.h> void print_vars(int *n) { int i; for(i=0;i<=*n;i++) printf("%X %d ", (int)(n+i), *(n+i)); printf("/n"); } void pass_vars(int n, ...) { print_vars(&n); } int main() { pass_vars(4, 6, 7, 8, 0); return 0; }

En mi pc sale

$ ./a.out BFFEB0B0 4 BFFEB0B4 6 BFFEB0B8 7 BFFEB0BC 8 BFFEB0C0 0


Probablemente puedes usar macros variadic - como esto:

#define FOO(...) do { do_some_checks; myfun(__VA_ARGS__); } while (0)

¡NÓTESE BIEN! Las macros Variadic son solo para C99


Tienes que pasar va_list al ayudante.