Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

198
Vistas
envolviendo una llamada C printf() en una directiva de preprocesador

Estoy intentando portar el código C de una plataforma a otra y eliminar las dependencias.

Hay una función de depuración llamada dbg_out que se imprime como printf() .

El prototipo es void dbg_out(int dbgMask, const char *pFormat, ...);

Aquí hay una llamada de ejemplo: dbg_out((5, "SerialDriver : (%04x-%08lx) \n", id, sn));

Me gustaría asignar esta función a una llamada printf() normal pero tengo algunos problemas.

He intentado esto hasta ahora

 void dbg_out (int dbgMask, const char *pFormat, ...) __attribute__((format(printf, 2, 3))) ;

Necesito ignorar el primer parámetro dbgMask y solo tener en cuenta los otros parámetros.

Preferiría usar el preprocesador para definir un contenedor. Agradecería algo de ayuda con esto.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Necesita usar vprintf en su lugar, para poder usar argumentos desconocidos

 inline void dbg_out (int dbgMask, const char *pFormat, ...) { va_list ptr; va_start(ptr, pFormat); vprintf(pFormat, ptr); va_end(ptr); }
over 4 years ago · Santiago Trujillo Denunciar

0

Usando una macro

Si desea usar una macro que cambie la llamada a dbg_out a una llamada directa a printf , puede usar una macro variable:

 #define dbg_out(mask, ...) printf(__VA_ARGS__) int main() { dbg_out(1, "%d", 12); }

si son llamados como en su pregunta con doble paréntesis (por ejemplo dbg_out((5, "%d", 12)); ), entonces primero debe desenvolverlo:

 #define EXPAND(mask, ...) (__VA_ARGS__) #define dbg_out(...) printf EXPAND __VA_ARGS__ int main() { dbg_out((1, "%d", 12)); }

Además, si sabe que el formato es siempre un literal de cadena , también puede agregar la máscara a la salida de printf , por ejemplo:

 #define dbg_out(mask, format, ...) printf("[Mask:%d]" format, mask, ##__VA_ARGS__) int main() { dbg_out(1, "%d", 12); }

con llamadas de doble paréntesis:

 #define EXPAND(mask, format, ...) ("[Mask:%d]" format, mask, ##__VA_ARGS__) #define dbg_out(...) printf EXPAND __VA_ARGS__ int main() { dbg_out((1, "%d", 12)); }

Redirigir a otra función con una macro

En caso de que no pueda cambiar la implementación de dbg_out , puede usar una macro para redirigir la llamada a otra función que haga el trabajo:

 #include <stdarg.h> #define dbg_out(...) dbg_out_new(__VA_ARGS__) void dbg_out_new(int mask, const char* fmt, ...) __attribute__((format(printf, 2, 3))); void dbg_out_new(int mask, const char* fmt, ...) { va_list va; va_start(va, fmt); vprintf(fmt, va); va_end(va); } int main() { dbg_out(1, "%d", 12); }

Si se llama con doble paréntesis, debe cambiar la macro a:

 #define dbg_out(...) dbg_out_new __VA_ARGS__ /* ... */ int main() { dbg_out((1, "%d", 12)); }

Con __attribute__(format()) también obtiene el beneficio de la verificación de tipos de argumentos en tiempo de compilación, como en el ejemplo "Uso de una macro".

Cambiar la función

En caso de que pueda editar la implementación de la función dbg_out , puede reemplazarla con la implementación dbg_out_new anterior.

Sin embargo, esto no funcionará si se llama con doble paréntesis como escribió en su pregunta.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda