gcc c++ zahada

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Neděle Březen 29 18:28:22 CEST 2020


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?






Další informace o konferenci Hw-list