Portál AbcLinuxu, 8. května 2025 20:13
#define MACRO 5
...
int var = 10;
#undef MACRO
#define MACRO var
Nejsem si teda jistej, jestli to vůbec jde... Díky
var
. A to je taky ta jediná úplná jistota, kterou máš.
Dost nejasné naopak je, jak si vlastně představuješ, že makra fungují.
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;
#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é
int MACRO = 5; ... MACRO = 3;
#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);
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.