Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > #pragma strartup


Автор: gamedeveloper 21.11.2007, 20:58
Просматривал хелп по Си Билдеру и наткнулся на эту прагму. Возник вопрос зачем использовать её? Чем принципиально отличается:

Код

void InitGraphFunc() {

}

#pragma startup InitGraphFunc 100

int main() {
  return 0;
}


от

Код

int main() {
  InitGraphFunc();
  return 0;
}

Автор: Alek86 21.11.2007, 21:20
вроде, функция тогда вызовется перед функцией main

Автор: gamedeveloper 21.11.2007, 21:27
Это я знаю.
А как это использовать можно?

Автор: archimed7592 21.11.2007, 21:29
Цитата(gamedeveloper @  21.11.2007,  21:27 Найти цитируемый пост)
А как это использовать можно? 

Думаю, лучше не использовать вовсе smile.
До main, вроде как даже инициализация статических объектов не гарантируется smile. До main вообще жизни нету smile.

Автор: Alek86 21.11.2007, 21:53
тут был бред smile

Автор: Mayk 22.11.2007, 04:39
Цитата(gamedeveloper @  22.11.2007,  01:27 Найти цитируемый пост)
Это я знаю.
А как это использовать можно? 

Если второй параметр задаёт приоритет инициализации, то таким образом можно задать что какая либо foo() будет вызвано до bar(), которая ожидает что foo() уже завершено. А вот если мы сделаем [code]struct FooCaller{ 
  FooCaller(){ 
    foo() ; 
  }
}fooCaller;[/b] в foo.cpp и аналогичный BarCaller в bar.cpp то совершенно не ясно какой из двух ctr'ов будет вызван раньше.

Правда я не уверен в том что второй параметр суть приоритет.

Автор: xvr 22.11.2007, 15:03
Цитата(gamedeveloper @ 21.11.2007,  20:58)
Просматривал хелп по Си Билдеру и наткнулся на эту прагму. Возник вопрос зачем использовать её? 

А зачем в C++ используют статические объекты, их же можно все в main засунуть  smile 
Или пишешь ты библиотеку из 100 файлов и говоришь пользователю (в документации), что для нормальной работы этой библиотеки он должен вызвать в main вот эти 100 функций <здесь подставить список>  smile Или ты их сам вызываешь в файлах, где они описаны этой самой прагмой. Чуствуешь разницу?  smile 

Автор: archimed7592 22.11.2007, 18:08
Цитата(xvr @  22.11.2007,  15:03 Найти цитируемый пост)
А зачем в C++ используют статические объекты, их же можно все в main засунуть  smile 

Мда уж... Зачем на С++ писать, можно же и на асемблере писать.

Статические объекты тем и хороши, что "сами по себе" сконструируются.

Автор: bsa 22.11.2007, 18:12
Цитата(xvr @ 22.11.2007,  15:03)
Или пишешь ты библиотеку из 100 файлов и говоришь пользователю (в документации), что для нормальной работы этой библиотеки он должен вызвать в main вот эти 100 функций <здесь подставить список>  smile Или ты их сам вызываешь в файлах, где они описаны этой самой прагмой. Чуствуешь разницу?  smile

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

Автор: xvr 22.11.2007, 18:54
Цитата(bsa @ 22.11.2007,  18:12)
Цитата(xvr @ 22.11.2007,  15:03)
Или пишешь ты библиотеку из 100 файлов и говоришь пользователю (в документации), что для нормальной работы этой библиотеки он должен вызвать в main вот эти 100 функций <здесь подставить список>  smile Или ты их сам вызываешь в файлах, где они описаны этой самой прагмой. Чуствуешь разницу?  smile

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

'Вменяемые' либы пишут в виде большого набора небольших независимых модулей, что бы при подключении из нее линковалось только то, что необходимо, а не вся либа в виде одного большого кирпича smile Если все функции инициализации собрать в одну, то и получится тот самый кирпич :(
Так что все таки пишут 100 функций инициализации и обвертывают их в статические классы (если используется С++) или используют разные атрибуты и прагмы, типа startup.
За 100 функций инициализации, отданных пользователю, действительно надо отрывать все, что можно smile

Автор: archimed7592 22.11.2007, 18:56
Цитата(xvr @  22.11.2007,  18:54 Найти цитируемый пост)
обвертывают их в статические классы

Угу, может ещё поведуешь нам, что это за статические классы такие? smile

Автор: xvr 22.11.2007, 19:06
Цитата(archimed7592 @ 22.11.2007,  18:56)
Цитата(xvr @  22.11.2007,  18:54 Найти цитируемый пост)
обвертывают их в статические классы

Угу, может ещё поведуешь нам, что это за статические классы такие? smile

Статические экземпляры специально созданных классов в конструкторе которых вызываются те самые функции инициализации.

Автор: archimed7592 22.11.2007, 20:11
Цитата(xvr @  22.11.2007,  19:06 Найти цитируемый пост)
Статические экземпляры специально созданных классов в конструкторе которых вызываются те самые функции инициализации.

Это называется статическими объектами и, IIRC, кто-то высказывал следующее:
Цитата(xvr @  22.11.2007,  15:03 Найти цитируемый пост)
А зачем в C++ используют статические объекты, их же можно все в main засунуть  smile 

А тут вдруг оказывается, что во вменяемых либах их в main не засовывают(в которых его по сути и нет). Вот ты и ответил на свой же вопрос smile.

Автор: gamedeveloper 22.11.2007, 20:14
Хорошо, спасибо всем (киваю головой и делаю вид что всё понял).
Но ещё вопрос: почему этой прагмы нет в Вижуал Студии? Или там вместо неё startup-заменитель?

Автор: archimed7592 22.11.2007, 20:18
Цитата(gamedeveloper @  22.11.2007,  20:14 Найти цитируемый пост)
почему этой прагмы нет в Вижуал Студии?

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

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

Автор: gamedeveloper 22.11.2007, 20:21
Цитата(archimed7592 @ 22.11.2007,  20:18)
По сути, не совсем понятно, зачем эта прагма вообще нужна...

Вот! Это я и имел ввиду, когда создавал тему - ЗАЧЕМ?

Хотя пример с либами я прояснил немного.

Автор: archimed7592 22.11.2007, 20:28
Цитата(gamedeveloper @  22.11.2007,  20:21 Найти цитируемый пост)
ЗАЧЕМ?

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

Автор: xvr 22.11.2007, 21:55
Цитата(archimed7592 @ 22.11.2007,  20:11)
Цитата(xvr @  22.11.2007,  19:06 Найти цитируемый пост)
Статические экземпляры специально созданных классов в конструкторе которых вызываются те самые функции инициализации.

Это называется статическими объектами и, IIRC, кто-то высказывал следующее:
Цитата(xvr @  22.11.2007,  15:03 Найти цитируемый пост)
А зачем в C++ используют статические объекты, их же можно все в main засунуть  smile 

А тут вдруг оказывается, что во вменяемых либах их в main не засовывают(в которых его по сути и нет). Вот ты и ответил на свой же вопрос smile.

Это не мой вопрос, это мой ответ на вопрос gamedeveloper'а зачем нужна прагма startup, если все функции из нее можно явно позвать в main? Там еще в ответе (который мой) такой smile smile стоял. В следующий раз буду явно подписывать <ИРОНИЯ>, для тех кто юмора не понимает smile

Добавлено через 2 минуты и 39 секунд
Цитата(archimed7592 @ 22.11.2007,  20:18)
Цитата(gamedeveloper @  22.11.2007,  20:14 Найти цитируемый пост)
почему этой прагмы нет в Вижуал Студии?

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

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

Зачем нужна прагма и почему не хватает статических объектов:
1) Существуют просто С программы, где объектов нет, а прагмы есть
2) Эта прагма позволяет задать порядок инициализации (в виде приоритета), чего нельзя сделать в СТАНДАРТНОМ С++

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)