Принцип работы атрибутов функции constructor/destructor

Code:

#include <cstdio>

void func1();
void func2();
void func3();

void __attribute__((constructor)) func1();
void __attribute__((constructor)) func2();
void __attribute__((destructor)) func3();

void func1()
{ 
  printf("Inside func1()\n");
}

void func2()
{
  printf("Inside func2()\n");
}

void func3()
{
  printf("Inside func3()\n");
}

int main()
{
  printf("Inside main()\n");

  return 0;
}
  1. Интересует вопрос, почему constructor/destructor выполняют свою роль, не находясь в функции main(), правильно ли я понимаю, что они обязательны в выполнении, даже не находясь в main?

  2. Почему вывод выглядит таким образом? (compiler GCC):

    Inside func1() Inside func2() Inside main() Inside func3()

Я сначало подумал, мол деструктор выполняется в конце, а main ближе всё-же к конструктору (пускай это и глупо), но если снести func3(), а destructor присвоить func2() то вывод будет:

Inside func1()
Inside func2()
Inside main()

Ответы (1 шт):

Автор решения: KoVadim

Вообще то это не с++ и никакой не конструктор и не деструктор. Это расширение gcc. https://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/Function-Attributes.html

Функции, которые помечены такими аттрибутами будут выполняться до и после main соответственно. Компилятор сам вставит их вызовы неявно в нужное место.

Интересует вопрос, почему constructor/destructor выполняют свою роль, не находясь в функции main(), правильно ли я понимаю, что они обязательны в выполнении, даже не находясь в main?

а потому что это не с++:). И компилятор вставит их вызовы сам.

Почему вывод выглядит таким образом? (compiler GCC):

потому что конструкторы до main, деструкторы - после.

Я сначало подумал, мол деструктор выполняется в конце, а main ближе всё-же к конструктору (пускай это и глупо), но если снести func3(), а destructor присвоить func2() то вывод будет:

нет, он будет такой , что вполне ожидаемо.

Inside func1()
Inside main()
Inside func2()
→ Ссылка