Название: Статические классы в статической библиотеке ??? Отправлено: alex12 от Август 13, 2009, 20:53 Недавно на форуме была ссылка на такой документ: http://qt.gitorious.org/qt/pages/CodingConventions
Там есть пункт про статические объекты, размещенные в статической библиотеке. Утверждается, что для них может не вызываться конструктор класса и они предлагают использовать макрос Q_GLOBAL_STATIC. У меня в проекте есть статический QString, выполняющий роль буфера вывода на служебную консоль. Пока я никаких проблем не замечал. Простой тестовый пример на компиляторе MinGW показывает, что все хорошо и конструктор вызывается. Тест с gcc в linux тоже проблемы не выявил. Насколько обоснованны их опасения? Сталкивался ли кто с такой ситуацией? Цитировать Anything that has a constructor or needs to run code to be initialized cannot be used as global object in library code, since it is undefined when that constructor/code will be run (on first usage, on library load, before main() or not at all). Even if the execution time of the initializer is defined for shared libraries, you’ll get into trouble when moving that code in a plugin or if the library is compiled statically: Код: // global scope Код: // global scope Use Q_GLOBAL_STATIC to create static global objects instead: Код:
Note: Static objects in a scope are no problem, the constructor will be run the first time the scope is entered. The code is not reentrant, though. Название: Re: Статические классы в статической библиотеке ??? Отправлено: SABROG от Август 13, 2009, 21:27 Цитировать Пока я никаких проблем не замечал. Ну это не значит, что они не могут возникнуть. Проблема старая. http://faqs.org.ru/progr/c_cpp/cpp_lite3.htm Чтобы она всплыла достаточно завести новый класс, который вынести в отдельный файл и использовать там эту статическую переменную. С вероятностью в 50% возникнет проблема. Один и тот же код может по-разному работать будучи собранным на разных компиляторах. Решение простое, прописать статическую переменную внутри метода/функции: Код
Тогда объект будет создан в момент вызова этой функции и не будет необходимости гадать был ли выполнен конструктор до его использования или нет. Т.е. это не проблема Qt, это проблема всего C++. То, что работает сейчас - не показатель, надо сразу учиться писать программы правильно. Название: Re: Статические классы в статической библиотеке ??? Отправлено: Winstrol от Август 13, 2009, 21:33 Насколько обоснованны их опасения? Сталкивался ли кто с такой ситуацией? Это qtэшная реализация шаблона singleton. В книге А.Александреску про него много понаписано для чего он нужен, в том числе и грабли статических объектов. Если кратко, то порядок инициализации статических объеков, объявленных в разных cpp файлах, не определен, поэтому объекты из разных модулей не могут зависеть друг от друга. Название: Re: Статические классы в статической библиотеке ??? Отправлено: alex12 от Август 13, 2009, 21:41 Решение простое, прописать статическую переменную внутри метода/функции: Код Тогда объект будет создан в момент вызова этой функции... Действительно, простое решение. Спасибо. Название: Re: Статические классы в статической библиотеке ??? Отправлено: Winstrol от Август 13, 2009, 21:45 Действительно, простое решение. Спасибо. Простое, но не thread-safe.Название: Re: Статические классы в статической библиотеке ??? Отправлено: ритт от Август 13, 2009, 21:45 в случае с кустригом ничего страшного, наверное, не будет (не знаю, мб с кодеками какая возня случится из-за неверной последовательности), но в общем и целом предыдущие ораторы правы - в первую очередь Q_GLOBAL_STATIC нужен для выполнения контроля за временем жизни объекта - это и без чтения Александреску можно понять :)
а вот для статического QSettings последовательность инициализации была бы уже критична. поэтому, слушай SABROG'а - пиши правильно изначально ) Название: Re: Статические классы в статической библиотеке ??? Отправлено: alex12 от Август 13, 2009, 22:05 Я с радостью начну использовать Q_GLOBAL_STATIC, но несколько смущает его статус "for internal use".
Название: Re: Статические классы в статической библиотеке ??? Отправлено: ритт от Август 14, 2009, 01:45 и? это макрос - раз, не встречается в апи - два. т.е. реализацию могут изменить в любой момент. но об этом нет смысла беспокоиться.
Название: Re: Статические классы в статической библиотеке ??? Отправлено: SABROG от Август 14, 2009, 08:13 Эмм, народ. http://qt.gitorious.org/qt/pages/CodingConventions написан не для пользователей Qt, а для разработчиков, которые будут коммитить свои патчи для Qt в git'e.
Название: Re: Статические классы в статической библиотеке ??? Отправлено: SASA от Август 20, 2009, 12:20 Можно создать класс, и у него статический член.
Цитировать Note: Static objects in a scope are no problem, the constructor will be run the first time the scope is entered. Использую не только QString, всё прикрасно работает.Была проблема в Linux использования статических данных в статических библиотеках. Если подлинковывать её в несколько длл, которые подгружаются в один исполняемый файл, то при завершении программы каждая длл пытается удалить эти данные. Ну и на второй попытке прога падает. Как это обойти не понял, поэтому из статической библиотеки сделал динамическую. Может кто подскажет другой путь. |