Quiero escribir una macro en C que acepte cualquier número de parámetros, no un número específico
ejemplo:
#define macro( X ) something_complicated( whatever( X ) )
donde X
hay cualquier número de parámetros
Necesito esto porque whatever
está sobrecargado y se puede llamar con 2 o 4 parámetros.
Traté de definir la macro dos veces, ¡pero la segunda definición sobrescribió la primera!
El compilador con el que estoy trabajando es g ++ (más específicamente, mingw)
c
g++
c-preprocessor
variadic
Hasen
fuente
fuente
Respuestas:
Forma C99, también compatible con el compilador VC ++.
fuente
##
No es necesario y no es portátil.#define FOO(...) printf(__VA_ARGS__)
hace el trabajo de forma portátil; elfmt
parámetro puede omitirse de la definición.__VA_ARGS__
Es la forma estándar de hacerlo. No use hacks específicos del compilador si no es necesario.Estoy realmente molesto porque no puedo comentar sobre la publicación original. En cualquier caso, C ++ no es un superconjunto de C. Es realmente tonto compilar su código C con un compilador de C ++. No hagas lo que Donny Don't hace.
fuente
class
conklass
para permitir compilar con un compilador de C ++. También tenga en cuenta que hay algunas diferencias que lo harán tropezar; por ejemplo, el operador ternario no se evalúa de la misma manera en ambos idiomas, y lainline
palabra clave significa algo completamente diferente (como aprendí de una pregunta diferente).No creo que sea posible, podrías fingirlo con dobles padres ... siempre y cuando no necesites los argumentos individualmente.
fuente
Si el compilador no comprende macros variables, también puede eliminar PRINT con cualquiera de los siguientes:
o
El primero comenta las instrucciones de IMPRESIÓN, el segundo evita la instrucción de IMPRESIÓN debido a una condición NULL si. Si se establece la optimización, el compilador debe eliminar instrucciones nunca ejecutadas como: if (0) print ("hello world"); o ((nulo) 0);
fuente
if
versión adecuada de "no haga esto" que tenga en cuenta la estructura del código es:if (0) { your_code } else
un punto y coma después de que su expansión de macro finalice elelse
. Lawhile
versión se ve así:while(0) { your_code }
el problema con lado..while
versión es que el códigodo { your_code } while (0)
se realiza una vez, garantizado. En los tres casos, siyour_code
está vacío, es correctodo nothing gracefully
.explicado para g ++ aquí, aunque es parte de C99, por lo que debería funcionar para todos
http://www.delorie.com/gnu/docs/gcc/gcc_44.html
ejemplo rápido:
fuente
__VA_ARGS__
, aunque también es compatible con compiladores en versiones anteriores, como una extensión.