gcc c++ zahada

Miroslav Mraz mrazik na volny.cz
Pondělí Březen 30 09:21:32 CEST 2020


To má dost divnou syntaxi. Spíš bych psal
constexpr static const uint16_t sms_handle_period_ = 30u;
a už vůbec nerozumím konstrukci
next_sms_handle += seconds{sms_handle_period_};
ale pokud je smysl
next_sms_handle += sms_handle_period_;
pak by to mělo fungovat. Constexpr se v C++ používá místo makra kvůli 
lepší typové kontrole ale jestli se bez optimalizace rezervuje místo v 
paměti netuším. Nemělo by se, constexpr by se mělo rozvinout vždy v 
místě, kde je použito stejně jako makro. Samozřejmě to ale autoři 
překladače můžou chápat jinak.
Nicméně kdysi jsem udělal rekurzívní výpočet faktoriálu jako constexpr a 
pokud je to voláno s argumentem, který překladač v době překladu zná 
(opět constexpr), pak tam žádný výpočet není, je nahrazen číslem 
(výsledkem). Takže ten g++ je docela chytrý.

Mrazík

Dne 29. 03. 20 v 18:28 Jaroslav Buchta napsal(a):
> Zdravim, hrabu se v cizim kodu a narazil jsem na zajimavy problem.
> 
> V objektu je definovana konstanta:
> 
>          private:
>              constexpr static const uint16_t sms_handle_period_{30}; // 
> seconds
> 
> a ta pak pouzita v metode:
> 
>             void
>              run()
>              {
> 
> ....
> 
>                      if (now >= next_sms_handle)
>                      {
>                          next_sms_handle += 
> seconds{sms_handle_period_};    //chybovy odkaz je sem
> ...
> 
> 
> Pokud je zapnuta optimalizace O3, neni problem. Pokud vypnu optimalizace 
> na O0, tak linker hlasi chybu:
> 
> D:\Work\_Bednar_IOT\LinuxBuild\Workspace\Include/manager.h:210: 
> undefined reference to `bednar::detail::manager::sms_handle_period_'
> 
> Tusim, ze to bude tim, ze pri optimalizaci se pouzije rovnou konstanta 
> 30 a pamet pro konstantu se vubec nevyhradi, bez optimalizace to bude 
> brat z pameti.
> 
> a dalsi indicie - jsou tam dalsi podobne definovane konstanty, ty jsou v 
> metodach pouzity ve vyrazech a to je OK. Rozdil je tedy v tom, ze tady 
> je to pouzito pro inicializaci objektu std::chrono::seconds
> 
> Ted ale babo rad, proc vznika ta chyba? Prebornik v C++ nejsem ale co 
> jsem se snazil nastudovat, melo by to snad takto fungovat?
> 
> 
> 
> 
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list


Další informace o konferenci Hw-list