Sintaxes __attribute__((constructor)) e __attribute__((destructor)) em C

Escreva duas funções em C usando o compilador GCC, uma das quais é executada antes da função principal e a outra é executada após a função principal. Sintaxes específicas do GCC : 1. __atributo__((construtor)) sintaxe: Esta sintaxe específica do GCC, quando usada com uma função, executa a mesma função na inicialização do programa, ou seja, antes principal() função. 2. __attribute__((destruidor)) sintaxe: Esta sintaxe específica do GCC, quando usada com uma função, executa a mesma função logo antes do programa terminar por meio de _exit, ou seja, depois principal() função. Explicação : A forma como os construtores e destruidores funcionam é que o arquivo de objeto compartilhado contém seções especiais (.ctors e .dtors no ELF) que contêm referências às funções marcadas com os atributos construtor e destruidor, respectivamente. Quando a biblioteca é carregada/descarregada, o programa carregador dinâmico verifica se tais seções existem e, em caso afirmativo, chama as funções nelas referenciadas. Alguns pontos a respeito são dignos de nota: 1. __atributo__((construtor)) é executado quando uma biblioteca compartilhada é carregada normalmente durante a inicialização do programa. 2. __attribute__((destruidor)) é executado quando a biblioteca compartilhada é descarregada normalmente na saída do programa. 3. Presumivelmente, os dois parênteses servem para distingui-los das chamadas de função. 4. __atributo__ é uma sintaxe específica do GCC; não uma função ou macro. Código do motorista : CPP
   // C program to demonstrate working of   // __attribute__((constructor)) and   // __attribute__((destructor))   #include      // Assigning functions to be executed before and   // after main()   void     __attribute__  ((  constructor  ))     calledFirst  ();   void     __attribute__  ((  destructor  ))     calledLast  ();   void     main  ()   {      printf  (  '  n  I am in main'  );   }   // This function is assigned to execute before   // main using __attribute__((constructor))   void     calledFirst  ()   {      printf  (  '  n  I am called first'  );   }   // This function is assigned to execute after   // main using __attribute__((destructor))   void     calledLast  ()   {      printf  (  '  n  I am called last'  );   }   
Output:
I am called first I am in main I am called last  
Criar questionário