Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

209
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda