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 16:33 | IT novinky Ladislav Hagara | Komentářů: 0
    dnes 14:11 | Komunita

    Firefox 157 přinese zapnutou podporu rastrového grafického formátu JPEG XL. Založena je na v Rustu napsané implementaci jxl-rs používané i v Chrome a Chromiu.

    Ladislav Hagara | Komentářů: 0
    dnes 02:11 | Nová verze

    Vanilla OS 3 „Reunion“ byl vydán. Tato na Debianu „Sid“ založená desktopová distribuce s transakčními aktualizacemi „neměnného“ základního systému (ABRoot) nově podporuje architekturu arm64 (vedle x86-64), podporuje reprodukovatelné sestavení většiny balíčků a vylepšuje systémové nástroje. Vlastní meta-správce balíčků APX nyní používá Distrobox v2 a je dostupný i pro jiné distribuce.

    |🇵🇸 | Komentářů: 0
    včera 16:00 | IT novinky

    Řemínky pro Apple Watch, bezdrátová sluchátka nebo nabíjecí adaptéry. Takovou nabídku našli v uplynulých dnech příslušníci Celního úřadu v Liberci při kontrole kamenného obchodu na Náchodsku. Celkem zde zadrželi 3 035 kusů zboží podezřelého z porušování práv duševního vlastnictví. Pokud by se jednalo o originální výrobky, jejich hodnota by podle odhadu přesáhla 10,8 milionu korun.

    Ladislav Hagara | Komentářů: 10
    včera 14:11 | Nová verze

    Byla vydána verze 31.1 textového editoru GNU Emacs. Podrobný přehled novinek v souboru NEWS.

    Ladislav Hagara | Komentářů: 4
    včera 12:22 | Nová verze

    Webový prohlížeč Waterfox (Wikipedie), fork Firefoxu, byl vydán ve verzi 6.7.0. Postaven je na jádru Gecko ESR 153.

    Ladislav Hagara | Komentářů: 1
    včera 11:22 | Nová verze

    Multiplatformní open source voxelový herní engine Luanti byl vydán ve verzi 5.17.0. Podrobný přehled novinek v changelogu. Přidána byla základní podpora gamepadů. Opraveno bylo několik zranitelností. Původně se jedná o Minecraftem inspirovaný Minetest v říjnu loňského roku přejmenovaný na Luanti.

    Ladislav Hagara | Komentářů: 0
    včera 11:00 | IT novinky

    Americká technologická společnost Apple loni v Irsku na daních zaplatila 17 miliard dolarů (zhruba 350 miliard Kč). To představovalo 40 procent celkové částky, kterou firma odvedla na dani z příjmů po celém světě. Vyplývá to z účetních výkazů podniku. Platbu výrazně zvýšilo rozhodnutí Soudního dvora EU z roku 2024, podle něhož měl Apple doplatit Irsku na daních 13 miliard eur (313 miliard Kč).

    Ladislav Hagara | Komentářů: 0
    včera 09:55 | Zajímavý projekt

    CrossPoint Reader je open-source alternativní firmware pro menší, levné čtečky, vybavené cca čtyřpalcovým e-ink displejem. Zahrnuje aplikaci pro čtení e-knih a webový server pro konfiguraci a přenos souborů po síti. Verze 1.0 byla vydána v únoru 2026. Recenze současné verze 1.5 vyšla na Linux Weekly News.

    |🇵🇸 | Komentářů: 0
    21.8. 05:00 | Nová verze

    Byla vydána verze 1.98.0 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání. Vyzkoušet Rust lze například na stránce Rust by Example.

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (10%)
     (7%)
     (2%)
     (19%)
     (29%)
     (7%)
     (6%)
     (2%)
     (15%)
     (22%)
    Celkem 2496 hlasů
     Komentářů: 31, poslední 13.8. 00:27
    Rozcestník

    Dotaz: Redefinování makra v C++

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