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 11:44 | Nová verze

    Dibuja je jednoduchý kreslící program inspirovaný programy Paintbrush pro macOS a Malování pro Windows. Vydána byla verze 0.26.0.

    Ladislav Hagara | Komentářů: 0
    včera 23:33 | Nová verze

    Byla vydána nová verze 9.13 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    včera 21:44 | Komunita

    Na čem aktuálně pracují vývojáři GNOME a KDE Plasma? Pravidelný přehled novinek v Týden v GNOME a Týden v KDE Plasma.

    Ladislav Hagara | Komentářů: 0
    včera 16:33 | Nová verze

    Byla vydána nová stabilní verze 3.22.0, tj. první z nové řady 3.22, minimalistické linuxové distribuce zaměřené na bezpečnost Alpine Linux (Wikipedie) postavené na standardní knihovně jazyka C musl libc a BusyBoxu. Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    30.5. 00:33 | IT novinky

    FEL ČVUT vyvinula robotickou stavebnici pro mladé programátory. Stavebnice Brian byla navržená speciálně pro potřeby populární Robosoutěže. Jde ale také o samostatný produkt, který si může koupit každý fanoušek robotiky a programování od 10 let, ideální je i pro střední školy jako výuková pomůcka. Jádro stavebnice tvoří programovatelná řídicí jednotka, kterou vyvinul tým z FEL ČVUT ve spolupráci s průmyslovými partnery. Stavebnici

    … více »
    Ladislav Hagara | Komentářů: 45
    29.5. 20:33 | Komunita

    Ubuntu bude pro testování nových verzí vydávat měsíční snapshoty. Dnes vyšel 1. snapshot Ubuntu 25.10 (Questing Quokka).

    Ladislav Hagara | Komentářů: 0
    29.5. 14:55 | Nová verze

    Společnost Netgate oznámila vydání nové verze 2.8.0 open source firewallové, routovací a VPN platformy pfSense (Wikipedie) postavené na FreeBSD. Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    29.5. 14:00 | Nová verze

    Byla vydána nová verze 6.16 živé linuxové distribuce Tails (The Amnesic Incognito Live System), jež klade důraz na ochranu soukromí uživatelů a anonymitu. Tor Browser byl povýšen na verzi 14.5.3. Linux na verzi 6.1.140. Další změny v příslušném seznamu.

    Ladislav Hagara | Komentářů: 0
    29.5. 12:33 | Zajímavý článek

    Člověk odsouzený za obchod s drogami daroval letos ministerstvu spravedlnosti 468 kusů kryptoměny bitcoin, které pak resort v aukcích prodal za skoro miliardu korun. Darováním se zabývá policejní Národní centrála proti organizovanému zločinu (NCOZ). Deníku N to potvrdil přímo ministr spravedlnosti Pavel Blažek (ODS). Podle resortu bylo nicméně vše v souladu s právem.

    Ladislav Hagara | Komentářů: 59
    28.5. 20:44 | Nová verze

    Svobodný a otevřený multiplatformní editor EPUB souborů Sigil (Wikipedie, GitHub) byl vydán ve verzi 2.5.0. Stejně tak doprovodný vizuální EPUB XHTML editor PageEdit (GitHub).

    Ladislav Hagara | Komentářů: 0
    Jaký je váš oblíbený skriptovací jazyk?
     (56%)
     (31%)
     (7%)
     (2%)
     (0%)
     (1%)
     (3%)
    Celkem 172 hlasů
     Komentářů: 13, poslední 30.5. 12:26
    Rozcestník

    Dotaz: Redefinování makra v C++

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