Változó makró

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2018. június 5-én felülvizsgált verziótól ; az ellenőrzések 4 szerkesztést igényelnek .

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] .

Deklaráció szintaxisa

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).

Támogatás

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 .

Példa

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.

Alternatívák

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) #endif

Ha 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

Lásd még

Jegyzetek

  1. A C99 előfeldolgozó szinkronizálására vonatkozó változtatások tervezete – http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1653.htm Archiválva : 2020. július 31. a Wayback Machine -nél

Források