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

204
Views
Cómo agregar un argumento a una va_list

Tengo el siguiente código:

 int __dmasprintf (char **s, const char *format, ...) { char buf[512]; va_list arg; int ret; va_start(arg,format); ret = vsprintf(buf, format, arg); va_end(arg); *s = strdup(buf); if (*s == NULL) return -1; return 0; }

Quiero agregar un argumento al argumento va_list antes de llamar a arg vsprintf() porque mi format contiene 1 argumento adicional al final.

¿Cómo agregar un argumento (por ejemplo char * myarg ) al arg va_list ?

¿O es posible pasar vsprintf() una lista personalizada?

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

no puedes

O necesita hacer dos vsprintf (¿seguramente vsnprintf ?), o reemplazar su función con una macro variable, como

 #define __dmasprintf(S, FMT, ...) ( \ (*S = do_dmasprintf(FMT, __VA_ARGS__, my_arg)) == NULL ? -1 : 0) char *do__dmasprintf (const char *format, ...) { char buf[512]; va_list arg; int ret; va_start(arg,format); ret = vsnprintf(buf, sizeof(buf), format, arg); va_end(arg); char *s = strdup(buf); return s; }

Notas:

  1. vsprintf con vsnprintf . No hay razón para usar el primero aquí (o prácticamente en cualquier otro lugar)
  2. ignoras ret . ¿Deberías?
  3. Mantuve el diseño de argumentos macro similar al original, pero dado que __VA_ARGS__ debe ser uno o más argumentos (no puede estar vacío), eso significa que se requiere al menos un argumento después de FMT . Simplemente elimine el argumento FMT por completo si desea permitir cero argumentos después de él.
over 4 years ago · Santiago Trujillo Report

0

Desafortunadamente, no hay una forma directa de hacerlo. Hay una razón para eso: las macros stdarg toman la dirección en la pila del último parámetro conocido y luego iteran directamente la pila.

Si puede usar macros, @Useless brindó una buena solución: tenga cuidado, las macros pueden tener efectos secundarios cuando pasa variables pre o posfijadas con ++ o -- .

Si desea evitar las macros, deberá escribir su propia variante de vsprintf. No hay problema, solo busque una fuente para C stdlib ( GNU libc podría ser un buen punto de partida) y sea valiente ... ¡espero que pueda usar macros!

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!