| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > #pragma strartup |
| Автор: gamedeveloper 21.11.2007, 20:58 | ||||
Просматривал хелп по Си Билдеру и наткнулся на эту прагму. Возник вопрос зачем использовать её? Чем принципиально отличается:
от
|
| Автор: Alek86 21.11.2007, 21:20 |
| вроде, функция тогда вызовется перед функцией main |
| Автор: gamedeveloper 21.11.2007, 21:27 |
| Это я знаю. А как это использовать можно? |
| Автор: archimed7592 21.11.2007, 21:29 |
Думаю, лучше не использовать вовсе До main, вроде как даже инициализация статических объектов не гарантируется |
| Автор: Alek86 21.11.2007, 21:53 |
| тут был бред |
| Автор: Mayk 22.11.2007, 04:39 |
Если второй параметр задаёт приоритет инициализации, то таким образом можно задать что какая либо foo() будет вызвано до bar(), которая ожидает что foo() уже завершено. А вот если мы сделаем [code]struct FooCaller{ FooCaller(){ foo() ; } }fooCaller;[/b] в foo.cpp и аналогичный BarCaller в bar.cpp то совершенно не ясно какой из двух ctr'ов будет вызван раньше. Правда я не уверен в том что второй параметр суть приоритет. |
| Автор: xvr 22.11.2007, 15:03 | ||
А зачем в C++ используют статические объекты, их же можно все в main засунуть Или пишешь ты библиотеку из 100 файлов и говоришь пользователю (в документации), что для нормальной работы этой библиотеки он должен вызвать в main вот эти 100 функций <здесь подставить список> |
| Автор: bsa 22.11.2007, 18:12 | ||
Такому писателю надо что-нибудь оторвать. Во всех вменяемых либах для этого создают одну функцию инициализации, которая уже в состоянии сама вызвать те 100, чтобы не тратить время использующего эту либу разработчика. |
| Автор: xvr 22.11.2007, 18:54 | ||||
'Вменяемые' либы пишут в виде большого набора небольших независимых модулей, что бы при подключении из нее линковалось только то, что необходимо, а не вся либа в виде одного большого кирпича Так что все таки пишут 100 функций инициализации и обвертывают их в статические классы (если используется С++) или используют разные атрибуты и прагмы, типа startup. За 100 функций инициализации, отданных пользователю, действительно надо отрывать все, что можно |
| Автор: archimed7592 22.11.2007, 18:56 |
Угу, может ещё поведуешь нам, что это за статические классы такие? |
| Автор: xvr 22.11.2007, 19:06 | ||
Статические экземпляры специально созданных классов в конструкторе которых вызываются те самые функции инициализации. |
| Автор: archimed7592 22.11.2007, 20:11 | ||||
Это называется статическими объектами и, IIRC, кто-то высказывал следующее:
А тут вдруг оказывается, что во вменяемых либах их в main не засовывают(в которых его по сути и нет). Вот ты и ответил на свой же вопрос |
| Автор: gamedeveloper 22.11.2007, 20:14 |
| Хорошо, спасибо всем (киваю головой и делаю вид что всё понял). Но ещё вопрос: почему этой прагмы нет в Вижуал Студии? Или там вместо неё startup-заменитель? |
| Автор: archimed7592 22.11.2007, 20:18 |
Потому что набор прагм у всех компиляторов разный. По сути, не совсем понятно, зачем эта прагма вообще нужна. Скорее всего она используется в исходниках самого компилятора... В общем тебе она не нужна, вот и забей на неё |
| Автор: gamedeveloper 22.11.2007, 20:21 | ||
Вот! Это я и имел ввиду, когда создавал тему - ЗАЧЕМ? Хотя пример с либами я прояснил немного. |
| Автор: archimed7592 22.11.2007, 20:28 |
Возможно затем, что у неё есть какая-нибудь специфика... К примеру, возможно, что она отрабатывает аккурат перед конструированием статических объектов. Или, может быть, с помощью этой прагмы можно избежать SIOF, свойственного статическим объектам в разных модулях... |
| Автор: xvr 22.11.2007, 21:55 | ||||||||
Это не мой вопрос, это мой ответ на вопрос gamedeveloper'а зачем нужна прагма startup, если все функции из нее можно явно позвать в main? Там еще в ответе (который мой) такой smile Добавлено через 2 минуты и 39 секунд
Зачем нужна прагма и почему не хватает статических объектов: 1) Существуют просто С программы, где объектов нет, а прагмы есть 2) Эта прагма позволяет задать порядок инициализации (в виде приоритета), чего нельзя сделать в СТАНДАРТНОМ С++ |