Portál AbcLinuxu, 8. května 2025 20:13

Dotaz: Redefinování makra v C++

7.4.2013 15:58 blorg
Redefinování makra v C++
Přečteno: 490×
Odpovědět | Admin
Zdravím, na začátku definuji makro a v průběhu ho potom potřebuju redefinovat, ale tak, aby měl hodnotu nějaké proměnné:
#define MACRO 5

...

int var = 10;

#undef MACRO
#define MACRO var

Nejsem si teda jistej, jestli to vůbec jde... Díky
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

7.4.2013 16:59 lofcek
Rozbalit Rozbalit vše Re: Redefinování makra v C++
Odpovědět | | Sbalit | Link | Blokovat | Admin
No ide .. preco by neslo. Len neviem, ci to robi presne to, co si predstavujete. Makra sa totiz len rozvinu na text a az ten sa potom kompiluje. Cize namiesto #define MACRO var, mozete rovno pouzivat len var a urobi to to iste.

A zmenit hodnota makra - to sa samozrejme da, len na citatelnosti to neprida. Ono vo vseobecnosti sa odporuca vyhybat sa makram a pouzit ich len tam, kde si je clovek uplne isty, ze to musi byt.
7.4.2013 17:16 blorg
Rozbalit Rozbalit vše Re: Redefinování makra v C++
No, var můžu použít ale nebudu mít úplnou jistotu.. a const var nemůžu vůbec
7.4.2013 17:20 potato
Rozbalit Rozbalit vše Re: Redefinování makra v C++
Ještě jednou: nejdřív se expandují makra, pak se teprve zdrojový kód kompiluje. Použití makra povede k identickému výsledku jako napsat do daného místa zdrojovéko kódu var. A to je taky ta jediná úplná jistota, kterou máš.

Dost nejasné naopak je, jak si vlastně představuješ, že makra fungují.
7.4.2013 17:34 blorg
Rozbalit Rozbalit vše Re: Redefinování makra v C++
Jasně, já jsem akorát myslel že je dobré je třeba použít namísto proměnných, protože makra mohou být jakoby konstantní, dokud je zase nepředefinujeme. Konstantní proměnná nejde předefinovat vůbec.
7.4.2013 18:06 potato
Rozbalit Rozbalit vše Re: Redefinování makra v C++
Úplně nerozumím, proč bys měl mít ve zdrojovém textu části závisející na pojmenování proměnné a navíc ji muset předefinovávat při jedné kompilaci. Možná to chce popsat pořádněji, o co se snažíš.

Jedna možnost je to, co píše níže Ivan. Pokud potřebuješ zakompilovat do jednoho objektu více jakýchsi variant kódu, tak použij šablony. To ale podle všeho neděláš.

Pokud se snažíš o to, aby ti preprocesor nahradil v kódu MACRO literálem 10, když to nemáš definováno na úrovni preprocesoru, nýbrž tak pouze inicializuješ proměnou, tak tohle z principu nejde.
7.4.2013 17:54 Ivan
Rozbalit Rozbalit vše Re: Redefinování makra v C++
Odpovědět | | Sbalit | Link | Blokovat | Admin
hmm nevim ceho presne potrebujes dosahnout, ale nesly by na to pouzit sablony?

neco jako
template<char * context, int i>
class Macro
{
enum { value = i};
}

template<<int i>
class Macro<"kontext1">
{
enum { value = 10};
}

popripade jeste by sly pouzit namespaces.
namespace Kontext1
{
  enum makro { value = 10 };
}
namespace Kontext2
{
  enum makro { value = 5 };
}

a pak uz jen:
using namespace Kontext1;
7.4.2013 19:33 blorg
Rozbalit Rozbalit vše Re: Redefinování makra v C++
Vlastně jde o to, že je makro defaultně předdefinované, ale uživatel má možnost ho za běhu změnit. A na hodnotě makra potom závisí deklarování jiných proměnných - kvůli tomu ho chci použít.
#ifdef MAKRO 5
int a = 0;

#elif MAKRO 3
int a = 1;

#endif
A jediný problém je, že nevím, jak makro předefinovat, aby mělo hodnotu nějaké proměnné
stativ avatar 7.4.2013 19:40 stativ | skóre: 54 | blog: SlaNé roury
Rozbalit Rozbalit vše Re: Redefinování makra v C++
Jediný problém je v tom, že to tak prostě nejde. Jak už ti tu někteří už několikrát řekli, makra se expandují ještě před kompilací, takže o proměnných neví naprosto nic.
Ať sežeru elfa i s chlupama!!! ljirkovsky.wordpress.com stativ.tk
7.4.2013 19:42 blorg
Rozbalit Rozbalit vše Re: Redefinování makra v C++
Takže na tohle si prostě můžu nechat zajít chuť. Zkusím to vyřešit jinak.
8.4.2013 02:30 ::: | skóre: 14 | blog: e_lama
Rozbalit Rozbalit vše Re: Redefinování makra v C++
Kdyz to potrebujes za behu menit tak z toho proste udelej (ne-konstantni) promennou:
int MACRO = 5;

...

MACRO = 3;
12.4.2013 12:21 Nikola Pajkovský | skóre: 16
Rozbalit Rozbalit vše Re: Redefinování makra v C++
takle urcite ne
Save the whales. Feed the hungry. Free the mallocs
8.4.2013 03:00 Logik
Rozbalit Rozbalit vše Re: Redefinování makra v C++
Zkus si najít něco o návrhovym vzoru dependency injection. Dělat todle "na globální" úrovni je "prasečina", ať už se to pokusíš vyřešit makrem (což z principu nejde) nebo globální proměnou (což by sice šlo, ale goto začátek věty :-)).
9.4.2013 20:37 blorg
Rozbalit Rozbalit vše Re: Redefinování makra v C++
jenže problém je v tom, že potřebuju udělat podmínku ještě před funkcí, a to prostě jde pokud vím tak jen s makrem
9.4.2013 22:11 kuka
Rozbalit Rozbalit vše Re: Redefinování makra v C++
Nepotrebujes udelat "podminku pred funkci", potrebujes resit nejaky realny problem. Vetsina jazyku zadne makro nema a problemy se tam resi. Popis co potrebujes vecne, ne technicky, udelat a jiste se najde vhodne reseni.
12.4.2013 13:01 Nikola Pajkovský | skóre: 16
Rozbalit Rozbalit vše Re: Redefinování makra v C++
Odpovědět | | Sbalit | Link | Blokovat | Admin
makra v jazyce C expanduji ve smlyslu, kde je vyskyt tokenu MAKRO, vloz obsah tela MAKRO. Makro muze byt pouzito jako pojmenovani konstany na rozumny nazev (pojmenovani bitu v bitmask), prejmenovani funkce, vytvareni funkce (dokonce umi i vracet hodntou), pro obecne generovani symbolu a pro podmineny preklad.

#define MS_NOSEC        (1 << 28)

static void foo(void)
{
     printf("%d\n", MS_NOSEC);
}
preprocesor vyexpanduje vsechny makra a vlozi jejich obsah na misto jmnena makra. vysledny kod pro preklad bude vypadat takhle

...
     printf("%d\n", (1 << 28));
...
z toho plyne i tvuj problem. #define MACRO var vyexpanduje na symbol var nebo jinimy slovy, prejmenuje symbol var na MACRO

#define MACRO 1

static void foo(void)
{
     printf("%d\n", MACRO);

#undef MACRO
#define MACRO var
     printf("%d\n", MACRO);     
}
se po preprocesoru stane

...
     printf("%d\n", 1);
     printf("%d\n", var);
...
Jedine, kdy se kod prelozi je, kdyz var bude deklarovane. V tomhle pripade to nutne musi byt promnenna. Vytvareni takoveho kodu vede pouze a jedine k chybam a necitelnosti. Timhle zpusobem to opravdu nepouzivej. A ono, predefinovani makra se opravdu deje, ale musi to mit svuj smysl. Makra jsou uzitecna, dobra, ale opatrne na ne.

/*
 * max() macros that also do strict type-checking
 */
#define max(x, y) ({                           \
       typeof(x) _max1 = (x);                  \
       typeof(y) _max2 = (y);                  \
       (void) (&_max1 == &_max2);              \
       _max1 > _max2 ? _max1 : _max2; })

#define gen_localtime(name)                           \
        static inline int localtime_##name(time_t *t) \
        {                                             \
                struct tm *lt = localtime(t);         \
                if (!lt)                              \
                        die_errno("localtime");       \
                                                      \
                return lt->tm_##name;                 \
        }

gen_localtime(mday);
Save the whales. Feed the hungry. Free the mallocs

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.