инициализация значения переменной extern после ее использования в xcode - PullRequest
0 голосов
/ 11 декабря 2019

Я использую некоторую переменную через export и extern, как показано ниже:

text.h

namespace xyz{
__attribute__((visibility("default"))) extern const abccore::id kTextClassID;
}

в text.cpp

namspace xyz
{
 extern const abccore::id kTextClassID("ValueClass");
}

теперь в другом файлеMacStartup.cpp

#include "text.h"
__attribute__((constructor))
void MacWorkStartup()
{
auto var = abccore::kTextClassID;
//and use this.
}

Теперь порядок должен быть таким, как если бы сначала kTextClassID получил свое значение, тогда MacWorkStartup должен иметь возможность использовать это. но сначала он пришел к функции MacWorkStartup, где я нашел какое-то мусорное значение, а затем получил его значение в файле cpp. что изменить, что в MacWorkStartup у него будет строка Value.It нормально работала в нашей прошлогодней версии, но из-за обновления xcode или чего-то еще (я не знаю), сейчас она не работает.

1 Ответ

0 голосов
/ 11 декабря 2019

Инициализация глобальных через несколько единиц перевода в неопределенных. Поэтому вы должны исправить свой код:

  • Переместить MacWorkStartup определение в тот же файл, что и kTextClassID определение.
  • Вызов MacWorkStartup в main вместо (непереносимый) конструктор атрибутов.
  • Использовать отложенную инициализацию kTextClassID:

    namespace xyz{
    __attribute__((visibility("default"))) const abccore::id& GetTextClassID()
    {
        static const abccore::id instance{"ValueClass"};
    
        return instance;
    }
    }
    
  • , если это уместно / возможно, constexprconsteval) может заменитьstatic.
...