abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
dnes 15:55 | Zajímavý projekt

Vyzkoušet si příkazy a vyřešit několik úkolů lze na stránkách Commandline Challenge (CMD Challenge). Úkoly lze řešit různými způsoby, důležitý je výsledek. Zdrojové kódy jsou k dispozici na GitHubu pod licencí MIT.

Ladislav Hagara | Komentářů: 2
včera 17:35 | Bezpečnostní upozornění

Německá Bundesnetzagentur (obdoba českého ČTU) zakázala na německém území prodej panenky Cayla kvůli „špionáži“ dětí. Tato elektronická hračka obsahuje mikrofon, reproduktor a kameru a bezdrátové komunikační rozhraní, pomocí kterého se hračka připojuje na servery výrobce. Takovýmto způsobem může hračka pomocí umělé inteligence „odpovídat“ na dotazy dítěte. Hlavní problém bude ale asi někde jinde, podle prvotních zpráv může

… více »
Petr Tomášek | Komentářů: 24
17.2. 15:30 | Bezpečnostní upozornění

CSIRT.CZ upozorňuje, že bezpečnostní experti objevili nový typ malwaru, jenž cílí na open source e-commerce platformu Magento. Malware je zajímavý tím, že se jedná o první svého druhu, jehož kód zůstává skrytý v SQL databázi zasaženého e-shopu. Škodlivý kód je volán pomocí tzv. SQL trigerru, který je spouštěn při každém vytvoření objednávky v systému.

Ladislav Hagara | Komentářů: 1
17.2. 09:00 | Nová verze

Bylo vydáno Ubuntu 16.04.2 LTS, tj. druhé opravné vydání Ubuntu 16.04 LTS s kódovým názvem Xenial Xerus. Přehled novinek v poznámkách k vydání a v přehledu změn.

Ladislav Hagara | Komentářů: 42
17.2. 06:00 | Zajímavý článek

Pavel Tišnovský se v dvoudílném článku na MojeFedora.cz věnuje tvorbě pluginů (modulů) pro bitmapový grafický editor GIMP. Pomocí pluginů lze GIMP rozšiřovat o další funkce. Implementovat lze například nové filtry nebo pomocné utility pro tvorbu animací či poloautomatickou retuš snímků.

Ladislav Hagara | Komentářů: 6
16.2. 23:32 | Komunita

Do 30. března se lze přihlásit do dalšího kola programu Outreachy, jehož cílem je přitáhnout do světa svobodného a otevřeného softwaru lidi ze skupin, jež jsou ve světě svobodného a otevřeného softwaru málo zastoupeny. Za 3 měsíce práce, od 30. května do 30. srpna 2017, v participujících organizacích lze vydělat 5 500 USD. Jedná se již o 14. kolo tohoto programu.

Ladislav Hagara | Komentářů: 11
16.2. 23:13 | Nová verze

Byla vydána verze 0.92.1 svobodného multiplatformního vektorového grafického editoru Inkscape. Přehled novinek v poznámkách k vydání. Řešen je mimo jiné problém s verzí 0.92, jež rozbíjí dokumenty vytvořené v předchozích verzích Inkscape. Více v příspěvku na blogu Davida Revoye, autora open source webového komiksu Pepper&Carrot nebo portrétu GNU/Linuxu.

Ladislav Hagara | Komentářů: 0
16.2. 16:26 | Bezpečnostní upozornění

Byla vydána verze 1.1.0e kryptografické knihovny OpenSSL. Dle bezpečnostního upozornění 20170216 byla opravena závažná bezpečnostní chyba CVE-2017-3733.

Ladislav Hagara | Komentářů: 1
16.2. 13:03 | Pozvánky

GNOME hackaton proběhne v Brně na FIT VUT v Red Hat Labu (budova Q) v pondělí 20. února od 15:00. Registrace není nutná, ale pokud dáte na FaceBooku vědět, že plánujete dorazit, pomůže to s plánováním.

Ladislav Hagara | Komentářů: 0
16.2. 13:02 | Pozvánky

Únorový Prague Containers Meetup se koná 21. února v budově MSD. Můžete se těšit na přednášky o tom, proč a jak používat kontejnery a zároveň získat zajímavý pohled na historii a budoucnost kontejnerů.

little-drunk-jesus | Komentářů: 0
Jak se stavíte k trendu ztenčování přenosných zařízení (smartphony, notebooky)?
 (13%)
 (2%)
 (72%)
 (3%)
 (10%)
Celkem 656 hlasů
 Komentářů: 52, poslední 13.2. 12:45
Rozcestník
Reklama

Dotaz: Redefinování makra v C++

7.4.2013 15:58 blorg
Redefinování makra v C++
Přečteno: 442×
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

Odpovědi

7.4.2013 16:59 lofcek
Rozbalit Rozbalit vše Re: Redefinování makra v C++
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++
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 extremni lama | 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;
The enemy of my enemy is still my enemy.
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++
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   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.