Инициализация спокойных ресурсов встраивается в статическую библиотеку

Компилятор не знал бы, хотели ли Вы сравнение указателя или глубокое (внутреннее) сравнение.

более безопасно просто не, реализуют его и позволяют программисту сделать это самостоятельно. Тогда они могут сделать все предположения, которые они любят.

13
задан Piotr Dobrogost 14 September 2009 в 08:15
поделиться

2 ответа

Это не сработало, потому что вам удалось получить поражение в результате фиаско статического порядка инициализации .

Вы не можете переместить свой код, инициализирующий статические объекты, за пределы единицы трансляции (вы можете прочитать его как исходный файл), в котором используются эти статические объекты. Не так, как ты это сделал. Если вы хотите использовать схему, которую вы используете для инициализации этих статических объектов, переместите только объявления в заголовок init.hpp, но оставьте instatiations StaticLibInitializer staticLibInitializer; в каждом файле, который использует статические объекты.
Приведенный выше совет предполагает, что каждый виджет использует только свои собственные ресурсы. Если у вас есть ситуация, в которой ресурсы одного виджета используются другим виджетом, вы снова столкнетесь с фиаско статического порядка инициализации. Вы можете управлять этой ситуацией, используя такой код

StaticLibInitializer
{
    void initialize()
    {
        static Q_INIT_RESOURCE(qtwidgets_custom_resources);
    }

    StaticLibInitializer()
    {
         initialize();
    }
}

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

11
ответ дан 1 December 2019 в 23:32
поделиться

Макрос Q_INIT_RESOURCE не может использоваться в пространстве имен.

Позвольте мне процитировать руководство по qt: «Примечание. Этот макрос нельзя использовать в пространстве имен. Его следует вызывать из главный()". И даже он дает вам пример того, как сделать это правильно, если это невозможно:

  inline void initMyResource() { Q_INIT_RESOURCE(myapp); }

    namespace MyNamespace
    {
     ...

     void myFunction()
     {
         initMyResource();
     }
  }

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

7
ответ дан 1 December 2019 в 23:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: