Forum » Programiranje » [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?
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)
(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?)
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:
2. operator , (ja, vejca:)
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
4. Skrajne preprocesor norcije se pa grejo boostovci: Boost.Preprocessor, verjetno bi celo lahko nekak nahekal zadevo :)
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. :)
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 . 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
Tale stvar izpise 5!! Ok, tole pa rece g++ -E:
S tem bi se dela ZELO na izi narest generiranje kode za vec parametrov in podobno...
Zdaj samo upam da to dela v MSVC!
#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!
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.
... 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 ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | C# je mozna referenca do int izven funkcije (direkt v classu torej)Oddelek: Programiranje | 1607 (1421) | TopCat |
» | [C] parse errorOddelek: Programiranje | 1019 (954) | ql000 |
» | [C++] prevajalnik hoce konstruktor za strukturoOddelek: Programiranje | 2592 (2296) | Tr0n |
» | [C++] tip spremenljivkeOddelek: Programiranje | 1587 (1495) | Gundolf |
» | [visual c++] #ifdef _DEBUGOddelek: Programiranje | 1095 (1036) | Vesoljc |