Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

196
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!