атрибут init_priority для переменных в статических библиотеках - PullRequest
1 голос
/ 08 октября 2010

Это новый вопрос после моей долгой разглагольствования.Проблема в том, что у меня есть глобальный vector<Base*> vObjs в моем основном приложении, и я получил Derived obj s в каждой статической библиотеке , связанной с приложением.Если я укажу vObjs, чтобы init_priority равнялся 101, а каждый obj в статических библиотеках говорил ... 1000, гарантируется ли, что vObjs вызовет свой конструктор до obj s в статических библиотеках?Спасибо за любую помощь.

Ответы [ 3 ]

2 голосов
/ 08 октября 2010

Позвольте мне повторить другие ответы, которые вы, возможно, захотите пересмотреть, используя для этого глобальные значения. Однако одно возможное (и, я уверен, все еще ошибочное) улучшение по крайней мере устраняет необходимость в приоритете инициализации.

Вместо использования глобального vector вы создаете функцию, которая возвращает ссылку на статическую локальную переменную. Правила C ++ гарантируют, что функция static local всегда инициализируется не позднее первого использования, поэтому вам не нужно беспокоиться о том, что вектор не инициализируется.

vector<LibInfo*>& get_gvLibInfo()
{
    vector<LibInfo*> gvLibInfo;
    return gvLibInfo;
}

Тогда ваша регистрация выглядит так:

vector<LibInfo*>& get_gvLibInfo();

void reglib()
{
    get_gvLibInfo().push_back(this);
}
1 голос
/ 08 октября 2010

Глобальные переменные были признаны вредными в течение почти сорок лет и все же люди все еще настаивают на их использовании Почему?

Пожалуйста, пересмотрите ваш дизайн , так как он хрупкий и собирается обеспечить головную боль при обслуживании на долгие годы.

0 голосов
/ 08 октября 2010

Если вы используете GNU C ++, похоже, они гарантируют порядок инициализации ( нажмите здесь ). Однако я должен отметить, что если вы действительно полагаетесь на порядок инициализации, тогда ваш дизайн хрупок. Лучше искать альтернативы, когда вы просто не заботитесь о заказе. НТН

...