c: MISRA2012

Miroslav Mraz mrazik na volny.cz
Čtvrtek Březen 25 20:41:02 CET 2021


Zaručuje norma, že bude daný výraz vyhodnocen při překladu ?
C++ constexpr ano. Ale nesežere jakýkoli výraz, to že sežere lround() je 
asi víceméně náhoda a vlastnost daného překladače. Nicméně nějaká 
funkce, která omezí hodnotu double tam být musí, double může být 
teoreticky vždy větší než jakákoli celočíselný typ.

static inline const uint8_t sat_u8 (const double x) {
   return x < 0.0 ? 0u : x > 255.0 ? 0xffu : (const uint8_t) x;
}
...
const uint8_t x = sat_u8 (20.1 / 1.1);

Pokud z toho udělám constexpr v C++, bude to korektní pro jakýkoli 
překaldač C++11 a spočítá se to při překladu. V C nevím, jestli dojde k 
vyhodnocení při překladu, ale stejně je to už hodně překombinované a co 
by na to MISRA se mi fakt nechce zkoumat.
Jak píše wek, dejte tam místo volatile const a bude hotovo.

Mrazík


Dne 25. 03. 21 v 19:25 Jan Waclawek napsal(a):
>> Asi jsem měl napsat, že chci, aby to tu konstantu vypočítalo při překladu. Tohle je očesané na kost, abych se nějak dopídil k rozuzlení.
> 
> No tak potom tam nesmiete pchat to volatile k tomu tmp.
> 
> wek
> 


Další informace o konferenci Hw-list