Fórumok
Nagyon kezdő kérdés: Hogyan lehet #define-kben stringeket öszefűzni?
Leírom mire gondolok, ez tudom, hogy nem jó, de elmondja mit szeretnék:
#define ESC_SEQ "\x1b["
#define RESET ESC_SEQ + "39;49;00m"
Esetleg használjak strcat-ot? Jobb szeretném, ha minden string külön kódolódna, konstansként.
Előre is kösz.
Hozzászólások
Arra épül, hogy az egymás után írt string-konstansok összefűzve értelmeződnek, lásd pl.:
Értem, köszönöm.
meg egy szokasos trukk:
---------------------
Q: Why do real Java programmers wear glasses?
A: Because they don't C#.
Hmmm... DEBUG(i < 5), DEBUG(i << 5), DEBUG((i < 5) ? (c >> 2) : (s[1] << 1)) ?
Én a magában álló makró-argumentumokat be szoktam zárójelezni:
A jellemző példa ezen elírásra:
Ez után nagyon csodálkozik az ember, hogy DUPLA(2+1) a várt 6 helyett 4-et ad, mert "2+1*2"-ként fejtődik ki, vagy a DUPLA(1<<3) a várt 16 helyett 64-et, mert "1<<3*2" az bizony "1<<6". A DUPLA_HELYES mindkét esetben kifogástalanul működik.
Ugyanez kód-makróra:
A fenti példa épp működik, de mit is csinálna a köv. kódrészlet?
Hát ezt:
Ha nem ezt akartuk, akkor célszerű a zárójelezés kód-megfelelőjét alkalmazni:
Szép dolgok a makrók, de elég csinos kis interjúkat adhat az ember a zacskós mikrofonba, ha nem figyel oda elégge :)...
> #define DUPLA_HELYES(X) (X)*2
Ez sem jó, ha a meghíváskor a szorzásnál erősebb precedenciájú művelettel vegyíted. Egy fokkal jobb:
#define DUPLA_HELYES(X) ((X)*2)
Ott a pont. Amúgy nem baj, legalább írtam példát arra is, hogy könnyű elnézni :)...
Izé, biztos nem voltam elég egyértelmű.
Szal arról van szó, amit a példakód ad: fix ESCAPE szekvenciákat akarok egy header fájlban eltárolni, későbbi felhasználás végett. Ehhez nem kell semmi hókuszpók, csak a konstansokat akarom bevésni.
Nem lesz valami nagy kód, egy osztott könyvtárat szeretnék csinálni, ami olyan kiírásokat tesz lehetővé C kódból, mint amilyenek a Gentoo-ban vannak (vájtfülűeknek: einfo, ewarn, eerror, ebegin, eend, esyslog), semmi egyéb.
OT, de javasolnam a termcap/terminfo adatbazisokat kezelo fuggvenyek vegignyalazasat, ugyanis total hordozhatatlan lesz igy a kod.
/ot
Egyelőre csak magamnak írom, pár kisebb program közös részeként. Majd ha nagy leszek és sokat fogok tudni a C nyelvről, akkor publikussá teszem meg terminfo meg minden nyalánkság lesz benne. Addig jó nekem a beégetett header is.
Jelen pillanatban ahova cél, ott úgy fog megjelenni ahogy kell.