<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"Form\00E1tovan\00FD v HTML Char";
        margin:0cm;
        font-size:10.0pt;
        font-family:"Courier New";}
span.FormtovanvHTMLChar
        {mso-style-name:"Form\00E1tovan\00FD v HTML Char";
        mso-style-priority:99;
        mso-style-link:"Form\00E1tovan\00FD v HTML";
        font-family:"Courier New";}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style></head><body lang=CS link=blue vlink="#954F72" style='word-wrap:break-word'><div class=WordSection1><p class=MsoNormal>Já to s těmi definy posledně vyzkoušel a nic takovýho se nedělo.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Teď pro jistotu znovu (tentokrát jen v C):</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><b><span lang=EN-US>#define BLA_a 123<o:p></o:p></span></b></p><p class=MsoNormal><b><span lang=EN-US>#define BLA_abc 321<o:p></o:p></span></b></p><p class=MsoNormal><b><span lang=EN-US><o:p> </o:p></span></b></p><p class=MsoNormal><b><span lang=EN-US>void main(void) {<o:p></o:p></span></b></p><p class=MsoNormal><b><span lang=EN-US>    int xxBLA_ayy = 888;<o:p></o:p></span></b></p><p class=MsoNormal><b><span lang=EN-US>    int xx123yy = 111;<o:p></o:p></span></b></p><p class=MsoNormal><b><span lang=EN-US><o:p> </o:p></span></b></p><p class=MsoNormal><b><span lang=EN-US>    printf("%d %d %d %d xxBLA_ayy", BLA_a, BLA_abc, xxBLA_ayy, xx123yy);<o:p></o:p></span></b></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>Překlad neselže  a v</span>ýsledek:</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><b>123 321 888 111 </b><b><span lang=EN-US>xxBLA_ayy</span><o:p></o:p></b></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>PH</p><p class=MsoNormal><o:p> </o:p></p><div style='mso-element:para-border-div;border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal style='border:none;padding:0cm'><b>Od: </b><a href="mailto:ondrej-hwl@hawsys.cz">Ondrej</a><o:p></o:p></p></div><p>Stane se to v C i v C++ (podle mě preprocesor je pro oba jazyky zhruba stejný). Osobně jsem se s tím koneckonců několikrát setkal.</p><p><o:p> </o:p></p><p>Jako příklad si vezměme  externí knihovnu, která v souboru "extLibErrCode.h" definuje</p><p>#define E_OK         666</p><p><o:p> </o:p></p><p>A dále "náš soubor" test.c, který bude obsahovat</p><p>#include <extLibErrCode.h></p><p><o:p> </o:p></p><p>#define ALE_OK              (1<<5)  // bit in register</p><p><o:p> </o:p></p><p>int ARE_OKAPI (Animal *a); //check if animal is okapi</p><p><o:p> </o:p></p><p>po průchodu preprocesorem se z souboru test.c stane</p><p>#include <extLibErrCode.h></p><p><o:p> </o:p></p><p>#define AL666              (1<<5)  // bit in register</p><p><o:p> </o:p></p><p>int AR666API (Animal *a); //check if animal is okapi</p><p><o:p> </o:p></p><p>a následný překlad selže. Bohužel původní soubor extLibErrCode.h není náš a nemůžeme ho změnit. </p><p><o:p> </o:p></p><p>Soubor test.c sice náš je, takže ho upravit můžeme (např. přidáním #undef E_OK) nicméně to není čisté řešení.</p><p><o:p> </o:p></p><p>V rámci C nastane podobný problém, pokud dvě entity definují stejnou globální proměnnou (třeba int last_error_code;). V C++ jde problém obejít tím, že vše se umístí do vhodného namespace. Jenomže preprocesor jde na řadu jako první a namespace ho naprosto nezajímají.</p><p><o:p> </o:p></p><p>Ještě bych dodal, že to co jsem psal nezvýší velikost kódu nebo proměnných o jediný byte. Optimalizace je koneckonců stejná pro CPU s 8 jako 800 MHz. Ono totiž když máte 800 Mhz tak tam toho většinou běží více nebo je úloha tak náročná, že plýtvat výkonem stejně nejde. Nehledě na to, že dělat optimalizaci předtím, než kód vůbec někde běží a můžeme si změřit, kde je "bottleneck" je cesta do pekel. Ono stejně v 99% případů buď optimalizace není potřeba nebo je nejlepší ji nechat na kompilátoru. A to 1% je buď něco jako kódování videa, na co se stejně použije externí knihovna nebo hodně specifický případ.</p><p><o:p> </o:p></p><p>Ondřej</p><p><o:p> </o:p></p><p><o:p> </o:p></p><div><p class=MsoNormal>Dne 24.8.2021 v 0:57 Pavel Hudecek napsal(a):<o:p></o:p></p></div><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><p class=MsoNormal>Já to teď vyzkoušel v C i C++ a teda nic takovýho se nedělo.<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>PH<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><div style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal><b>Od: </b><a href="mailto:konfera@efton.sk">Jan Waclawek</a><o:p></o:p></p></div><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>> * #define - [...] <o:p></o:p></p><p class=MsoNormal>> Pokud napø. <o:p></o:p></p><p class=MsoNormal>> definujete makro ERROR na 1 a nìkdo použije funkci se jménem PRINT_ERROR <o:p></o:p></p><p class=MsoNormal>> tak vaše makro jí zmìní na PRINT_1 (nehledì na namespace).<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>Takto to funguje v C++?<o:p></o:p></p><p class=MsoNormal><br><br><o:p></o:p></p><pre>_______________________________________________</pre><pre>HW-list mailing list  -  sponsored by <a href="http://www.HW.cz">www.HW.cz</a></pre><pre><a href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a></pre></blockquote><pre style='mso-margin-top-alt:0cm;margin-right:36.0pt;margin-bottom:5.0pt;margin-left:36.0pt'><a href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a></pre><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'><o:p> </o:p></span></p></div></body></html>