Ahoj mám prosbu. Dneska jsem narazil na zajímavej problém s makrem:
#define MSEC(value) ((value/5)-1)
Pokud se pokusím udělat tento zápis:
uint16_t xxx;
xxx = MSEC(10000 - 100);
tak se mi do proměné xxx uloží číslo 9979 nikoliv 1979 jak bych očekával. Používám kompilátor WinAVR-20100110 a nastavení optimalizací “s”. Nevíte někdo kde je zakopanej pes?
Já bych si tipnul že to čistě jenom vkládá obsah value tedy to 10000-100 a protože má dělení přednost před odčítáním, nejprve to provede 100/5 potom to odešte od 10000 a potom -1, tak bych to viděl i já, takže ta závorka navíc je tam potřeba.
Prekladac nemoze NAJPRV vypocitat 1000 - 100, lebo vo všeobecnosti tam môžeš napísať aj výraz z premenných. A prekladač nemá ako vedieť ich hodnoty niekedy v budúcnosti, nevraviac, že sa môžu meniť.
Myslím, že ešte jeden zápis by mohol byť v poriadku
kód:
uint16_t xxx;
xxx = MSEC((10000 - 100));
ale nemám čas to skúšať. V každom prípade všetky “hodnoty” makra definuj v makre ozatvorkovane. nikdy nevieš ako v budúcnosti makro použiješ a to že by si sa moho dobre diviť
Takéto chyby vo veľmi veľkom kóde sa ťažko hľadajú a pritom ozátvorkovanie “value” absolútne nič nestojí, ani čo sa rýchlosti a ani čo sa veľkosti výsledného kódu týka.