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.
- 1681 megtekintés
Hozzászólások
#define RESET ESC_SEQ "39;49;00m"
Arra épül, hogy az egymás után írt string-konstansok összefűzve értelmeződnek, lásd pl.:
#include int main(void) { return printf("hello " "world\n"); }
- A hozzászóláshoz be kell jelentkezni
Értem, köszönöm.
- A hozzászóláshoz be kell jelentkezni
meg egy szokasos trukk:
#include <iostream>
#define DEBUG(X) std::cerr << #X " erteke: " << X << '\n'
int main()
{
int i=5;
double x=0.2;
char c='a';
char s[]="bigyo";
DEBUG(i);
DEBUG(x);
DEBUG(c);
DEBUG(s);
return 0;
}
---------------------
Q: Why do real Java programmers wear glasses?
A: Because they don't C#.
- A hozzászóláshoz be kell jelentkezni
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:
#define DEBUG(X) std::cerr << #X " erteke: " << (X) << '\n'
A jellemző példa ezen elírásra:
#define DUPLA(X) X*2
#define DUPLA_HELYES(X) (X)*2
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:
#define HIBA(x) printf("Hiba: %s\n", (x)); return
if (feof(f))
{
fclose(f);
HIBA("baj van, babám");
}
A fenti példa épp működik, de mit is csinálna a köv. kódrészlet?
f = fopen("ize", "r");
if (!f)
HIBA("az ize nem nyitható");
Hát ezt:
f = fopen("ize", "r");
if (!f)
printf("Hiba: %s\n", ("az ize nem nyitható"));
return;
Ha nem ezt akartuk, akkor célszerű a zárójelezés kód-megfelelőjét alkalmazni:
#define HIBA(x) do { printf("Hiba: %s\n", (x)); return; } while (0)
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 :)...
- A hozzászóláshoz be kell jelentkezni
> #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)
- A hozzászóláshoz be kell jelentkezni
Ott a pont. Amúgy nem baj, legalább írtam példát arra is, hogy könnyű elnézni :)...
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
OT, de javasolnam a termcap/terminfo adatbazisokat kezelo fuggvenyek vegignyalazasat, ugyanis total hordozhatatlan lesz igy a kod.
/ot
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni