Блочная функция / сбой, если функция вызывается во время статической глобальной инициализации - PullRequest
0 голосов
/ 13 марта 2012

Могу ли я в любом случае вызвать сбой функции при вызове во время инициализации глобальной статической переменной? Функция использует другую глобальную статическую (из другого модуля) и поэтому небезопасна для вызова во время запуска.

У меня есть две причины для этого. Во-первых, если бы я мог как-то обнаружить этот сценарий, я мог бы напечатать полезное сообщение об отладке, вместо того, чтобы отследить его, если в противном случае произошла бы ошибка сегмента и дурацкого стека. Во-вторых, я могу предотвратить случайную работу. Иногда библиотеки и объектные файлы просто выстраиваются в правильном порядке, а порядок зависимостей в порядке, поэтому вы думаете, что код правильный, но это не так.

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

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

Обман GCC разрешен, так как достаточно было бы обнаружить его на одной из наших платформ.

1 Ответ

0 голосов
/ 13 марта 2012

Может быть что-то вроде этого:

#include <iostream>

bool& init()
{
    static bool inited=false;
    return inited;
}

class A
{
public:

    A()
    {
        if (! init())
        {
            std::cout<<"fail"<<std::endl;
        }
        else
        {
            std::cout<<"ok"<<std::endl;
        }
    }

};

A a1;

int main()
{
    init() = true;
    A a2;
}

Это не удастся для глобальной инициализации, и пройдет для создания в main ().


Выше не выглядит хорошо,но других путей нет, потому что (как вы сказали в своем вопросе) стандарт не гарантирует порядок инициализации объектов перед вводом main.Единственное предложение - избегать создания объектов до запуска main().

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...