Változó makró – a C előfeldolgozó azon képessége , hogy egy speciális makró segítségével eltérő számú argumentum támogatását deklarálja .
A változó argumentumú makrókat a C programozási nyelv szabvány ISO /IEC 9899:1999 ( C99 ) revíziójában vezették be 1999-ben. Ilyen makrókat a C++ programozási nyelv ISO/IEC 14882:2011 ( C++11 ) szabványában is bevezettek. szabvány 2011-ben [1] .
A deklaráció szintaxisa hasonló a variadic függvényekéhez : a " ... " kihagyás azt jelzi, hogy nulla vagy több argumentum adható át. Makróval bővítve a __VA_ARGS__ speciális azonosító minden hívása a makró cserelistájában lecserélődik az átadott argumentumokra.
A formális paraméterlistában szereplő egyes argumentumok nem érték vagy átadási mód szerint érhetők el.
A gcc-ben a formális makróparaméterek listája tartalmazhat megadott argumentumokat vagy változatosan átadott argumentumokat (lásd a példát).
A GNU Compiler Collection a 3.0-s verzió óta, a C++ Builder 2006 és a Visual Studio 2005 [1] támogatja a változó argumentumú makrókat a C és a C++ kódok fordításakor is . Ezenkívül a GCC támogatja a változó makrókat az Objective-C kód fordításakor .
Ha szüksége van egy printf - például a dprintf () függvényre , amely argumentumként veszi a fájlnevet és a sorszámot, amelyből meghívásra került, akkor a következő makrót használhatja:
void realdprintf ( char const * fájl , int sor , char const * fmt , ...); #define dprintf(...) realdprintf(__FILE__, __LINE__, __VA_ARGS__)A dprintf() így hívható:
dprintf ( "Hello world" );amely párnázott:
realdprintf ( __FILE__ , __LINE__ , "Hello, world" );vagy:
dprintf ( "%d + %d =%d" , 2 , 2 , 5 );amely párnázott:
realdprintf ( __FILE__ , __LINE__ , "%d + %d =%d" , 2 , 2 , 5 );Egy hiányos példa nem tükrözi a lehetőségeket, hozzáteszem:
#define CALL( _obj, _mtd, _specifiedArg1,_specifiedArg2, ... ) _obj->_mtd(_specifiedArg2,_specifiedArg1, __VA_ARGS__)így lehetőség van a megadott argumentumok egy részének manipulálására, a példában az argumentumok felcserélődnek.
Egyes esetekben egy közönséges makróhívás alternatívaként szolgálhat a variadic makrók helyett. Például a következő kód használható hibakereséshez :
#ifdef TRACING #define TRACE(_p) printf _p #else #define TRACE(_p) #endifHa a TRACING makró fordításkor van megadva, a TRACE makró meghívása megegyezik a printf függvény meghívásával :
TRACE (( "Futó sor %d \n " , __LINE__ ));Ha a TRACING makró nincs megadva, az üzenet nem kerül kinyomtatásra a program futása közben. Kérjük, vegye figyelembe, hogy ennek a makrónak a hívási paramétereit dupla zárójelek közé kell tenni.
Más esetekben a variadic makrók helyett használhatja a C/C++ nyelvek stdargs funkcióját és a vprintf függvény hívását .
Egy másik példa:
#if meghatározva ( DEBUG_MCU ) #define TRACE( args ... ) printf( args ) #else #define TRACE( args ... ) #endif