[Solved] String összeadás #define sorokban

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

#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");
}

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

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

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.

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.