Войти
ПрограммированиеФорумОбщее

Функции вызываемые по умолчанию C/С++

Страницы: 1 2 3 Следующая »
#0
(Правка: 10 сен. 2019, 18:27) 22:57, 9 сен. 2019

Можно при помощи простого, но костыльного способа вызвать функцию перед main, при помощи списка инициализации, например так

int a = myfun();
Насколько я помню есть способ (директивы) вызова таким же образом просто функции без костылей. А главное, то что мне нужно, вызвать функцию/метод по завершению корневой точки входа main, но не приложения.

Кто видел описание всего этого? Напомните, забыл.

Вот эта тема рабочая.


#1
23:19, 9 сен. 2019

жизнь до main() это шаблонное метапрограммирование и constexpr, уж не знаю как сейчас, давно не заглядывал в стандарт

#2
(Правка: 23:21) 23:20, 9 сен. 2019

Нельзя.

> C99: 5.1.2.2.1 Program startup: (1) The function called at program startup is named main.

В dll у Майкрософта кажется был ENTRYPOINT


Ну может всё-таки как-то задачу можно по другому сформулировать?

#3
23:36, 9 сен. 2019

foxes
> вызвать функцию/метод по завершению корневой точки входа main
Не понял. Что надо? Вызвать функцию после main()?

#4
23:41, 9 сен. 2019

atexit()?

#5
0:08, 10 сен. 2019
int main()
{
  before_main();
  // .. some shit
  after_main();
  return 0;
}
Если доступа к main нет, то это уже хаки и сплошное ub.
#6
1:34, 10 сен. 2019

foxes

Перед main вызываются все инициализаторы и конструкторы статических переменных. А из нульпоста нифига не понятно, что реально нужно.

#7
5:35, 10 сен. 2019

Ghost2
> и конструкторы статических переменных.
это не так если они не глобальные или не были сконструированы косвенно другими глобальными переменными. https://ideone.com/OibqSS

#8
(Правка: 6:58) 6:44, 10 сен. 2019

Aroch
> https://ideone.com/OibqSS
А что не нравится то?
В твоем примере все четко, все по правилам языка. Порядок иницализации глобальных и внешних статических переменных, в пределах одного файла, жестко определен. Тебе разве не это требовалось? Как раз перед main и сработает. Можешь даже несколько впихнуть, и порядок между ними отслеживать.
А локальные статические инициализируются при первом обращении, тоже все по правилам.

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

Хуже обстоят дела со статическими мемберами шаблонов. Лучше бы на точное место их инициализации не рассчитывать. И с dll быть осторожными, мемберы размножиться невзначай могут. В msvc версий 4-6 они умудрялись размножаться и без dll. Не знаю есть ли сейчас настолько забагованные компиляторы, надеюсь что нет.

#9
6:54, 10 сен. 2019

Zab
> А что не нравится то?
мне всё нравится, советую научится понимать контекст.

#10
7:03, 10 сен. 2019

Aroch
> мне всё нравится, советую научится понимать контекст.
А что я должен понимать из контекста? Не боишься, что пойму что-нибудь не то?
Например, что ты умудрился обучиться работе на C++, не прочитав ни одной книжки по нему. Угадал? Это очень трудно, но ты почти справился. Огрехи еще долго будут вылезать при таком подходе.

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

#11
7:09, 10 сен. 2019

Zab
> А что я должен понимать из контекста?
Ghost2: Перед main вызываются все инициализаторы и конструкторы статических переменных.
Aroch: нет это не так, держи пример. (показывает что бывают локальные статические переменные которые конструируются в момент первого использования).
прибегает Zab: *несет какую ту хрень на своей волне*

#12
8:03, 10 сен. 2019

#pragma exit
#pragma startup

#13
(Правка: 8:40) 8:33, 10 сен. 2019

Aroch

> нет это не так, держи пример
Что не так? Хватит тему засорять нонсенсом всяким.

#14
8:50, 10 сен. 2019

Ghost2
> Что не так? Хватит тему засорять нонсенсом всяким.
https://en.cppreference.com/w/cpp/language/storage_duration#Stati… cal_variables

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумОбщее