Typy v C++

Miroslav Šinko sinkomiro na gmail.com
Sobota Leden 15 13:45:17 CET 2022


On 15.1.2022 10:54, Jindroush wrote:
> PS: Ten priklad s tim makrem Log nedava takto smysl, anzto i kdyby bylo
> makro Log prazdne, stejne je tam strednik, takze v efektu je to "if(
> zapis );", coz zpusobi v nekterych prekladacich warning, ale nema to ten
> popisovany vedlejsi efekt.

Ano, problem byva skor opacny. Konkretny priklad (z "velkeho" pocitaca, 
nie MCU, preto printf :) )

Ked makro obsahuje viac prikazov, treba ho uzavriet do zlozenych 
zatvoriek, ako tu:

#define LOG(format, ...)\
{\
	printf(__FUNCTION__);\
	printf(": ");\
	printf(format, ##__VA_ARGS__);\
	printf("\n");\
}

Bez zatvoriek by takato konstrukcia pri nesplneni podmienky nevykonala 
len prvy prikaz, ostatne ano:

if(...)
   LOG("ERROR: ocrType=%hu is not known", ocrType);

Alebo takato konstrukcia by hodila error misplaced else, co je lepsi 
pripad, donuti sa zamysliet nad pricinou:

if(...)
   LOG("ERROR: ocrType=%hu is not used", ocrType);
else
   ...

Inac ja tiez zapisujem vsetky if/else so zatvorkami, je to dobry zvyk, 
teda takto:
if(...)
{
   LOG("ERROR: ocrType=%hu is not used", ocrType);
}

miro

> On 15.01.2022 10:40, Michal Gregor wrote:
>> Tak MISRA neni zbytecna. Ono to ignorrovani warningu se dost vymsti:
>>
>> uint16_t Teplota;
>> uint8_t TeplotaZobrazena;
>> TeplotaZobrazena = Teplota;
>> Prekladac tam samozrejme dal warning, ale vsichni na to kaslali. A pak
>> se hledala chyba asi dva dny.
>> Krome toho TeplotaZobrazena je pouze Fahrenheita ale Teplota muze byt
>> i v celsiech.
>>
>> Nebo tohle
>> if (zapis)
>>     Log(teplota);
>> teplota = teplota + 23;
>>
>> Dalsich par dni zabitych, kvuli lenosti. Log neni funkce, ale makro,
>> ktere funguje pouze v debug verzi. Takze se radek teplota = teplota +
>> 23; ignoroval.
>>
>> Spravne to ma byt:
>> if (zapis)
>> {
>>     DEBUG_LOG(teplota);
>> }
>>
>>
>>
>> Michal Gregor
>>


Další informace o konferenci Hw-list