» »

[C/C++] Variadic Macros

[C/C++] Variadic Macros

BigWhale ::

#define MYMACRO(...) { printf(__VA_ARGS__); }


Ali to podpira kaksna Microsoftova implementacija C prevajalnika (predprocesorja). Se mi zdi, da bo tole v 2005 verziji notri.

Torej bodo leta 2005 ujeli C99 kompatibilnost?

64202 ::

Tudi jaz upam da bo :))

(sicer se da nekako priti okoli omejitve, ce koga zanima lahko postam)
I am NaN, I am a free man!

Zgodovina sprememb…

  • spremenilo: 64202 ()

BigWhale ::

Kaj sploh sprasujes,... :P

Meni bi makri z variabilnim stevilom parametrov prisli prekleto prav ;>

(le zakaj sedaj MSjevci niso glasni, kot so ponavadi?)

Zgodovina sprememb…

  • spremenil: BigWhale ()

64202 ::

Ne, saj ne vem cisto prave resitve za preproc, samo se da pogosto zadevo drugace resiti:

1. Tvoj primer konkretno se resi tko:
#define MYMACRO(x) { printf x; }

Uporabis pa tko:
MYMACRO(("%d", 2))


2. operator , (ja, vejca:)
struct xxx {
   ...
   
   template <class T>
   xxx &operator , (T &o)
   { neka akcija nad o; return *this; }

   en_tip operator ! ()
   { ena akcija za zakljucek; }
};


Potem se to tako uporabi:
!(xxx(), arg1, arg2, arg3, arg4)

Je grdo, ampak dokaj splosno :)



3. Vedno ostane generiranje kode, sem si kar nardil eno preprosto perl funkcijo za to
template <class X1>
void neki(int a, int b, X1 x) { ... }

template <class X1, class X2>
void neki(int a, int b, X1 x, X2 x) { ... }


4. Skrajne preprocesor norcije se pa grejo boostovci: Boost.Preprocessor, verjetno bi celo lahko nekak nahekal zadevo :)
I am NaN, I am a free man!

Gundolf ::

Hmmm, makroti se mi ne zdijo ravno "in", približno tako kot goto, čeprav jih za razliko od goto kdaj uporabljam. In variadic makroti so mi bolj logični kot pa variadic funkcije (ki so pravzaprav ena velika packarija), tako da super ker so jih v C99 že uvedli. Ampak nazaj k uporabi makrotov, zakaj jih pa sploh rabiš, še posebej variadic? Jaz jih uporabim vedno le če vse ostalo odpove. Morda bi jih lahko nadomestil s templatei?

BigWhale ::

Gre se za 'release je bil en teden nazaj' popravek, kjer bi bilo potrebno narediti nekaj preverjanja preden se poklice ena funkcija, pa je makro najhitrejsa resitev.

Tista funkcija pa sprejema variabilno stevilo parametrov. V tem je problem. :)

SasoS ::

Macroji so uporabna zadeva...sploh če kaj debugiraš al pa kak SAFE_RELEASE da ni treba skos isto pisat if(p) p->release()...etc. Templatov ne maram ker pišem bolj C-jevsko kodo :D. Varianta 1 zgleda kar uporabna :)

64202 ::

Ok, ne vem ce je kdo vedel (jaz nisem!), ampak makroti so ocitno first-class v preprocesorju. Mislim, zdele se mi je odprlo par miljard moznosti :))
#include <stdio.h>

#define X(_c) _c(5)
#define Y(_i) int y() { return _i; }

X(Y)

int main() {
        printf("%d\n", y());

        return 0;
}


Tale stvar izpise 5!! Ok, tole pa rece g++ -E:
int y() { return 5; }

int main() {
        printf("%d\n", y());

        return 0;
}


S tem bi se dela ZELO na izi narest generiranje kode za vec parametrov in podobno...

Zdaj samo upam da to dela v MSVC!
I am NaN, I am a free man!

64202 ::

Me je cist na tla vrglo, tut to deluje:
#define X(_c, _d) _c(5, _d)
#define Y(_i, _d) int y() { return K(_d(_i)); }
#define D(_i) (_i * 2)
#define K(_i) (_i * 5)

X(Y, D)

-> int y() { return ((5 * 2) * 5); }
I am NaN, I am a free man!

SasoS ::

hmm...ja...tole je mal za premislt, ampak pol je nekak logično.

Vesoljc ::

meni je pa tale ful vsec
#define KILO   1000.0f*


;)
Abnormal behavior of abnormal brain makes me normal...

Nerdor ::

64202: oprosti, samo to je pa primer načina zelo grdega programiranja, kjer skonfuziraš še tako skoncentriranega bralca kode za teboj. :P
... for lifetime!

OwcA ::

Ni nujno. Kje je taka čudesa res smiselno uporabiti, je alternativa zelo veliko zelo podobne kode. Glede na to, da lahko ujameš kar je nabluzil preprocesor minusov takorekoč ni, je pa koda bolj pregledna in napake je moč odpraviti na enem mestu. Podobno kot kalupi pravzaprav.
Otroška radovednost - gonilo napredka.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C# je mozna referenca do int izven funkcije (direkt v classu torej)

Oddelek: Programiranje
81607 (1421) TopCat
»

[C] parse error

Oddelek: Programiranje
111019 (954) ql000
»

[C++] prevajalnik hoce konstruktor za strukturo

Oddelek: Programiranje
182592 (2296) Tr0n
»

[C++] tip spremenljivke

Oddelek: Programiranje
131587 (1495) Gundolf
»

[visual c++] #ifdef _DEBUG

Oddelek: Programiranje
51095 (1036) Vesoljc

Več podobnih tem