תחבירי __attribute__((בנאי)) ו-__attribute__((destructor)) ב-C

כתוב שתי פונקציות ב-C באמצעות מהדר GCC שאחת מהן מופעלת לפני הפונקציה הראשית ואחרת מופעלת אחרי הפונקציה הראשית. תחבירים ספציפיים ל-GCC : 1. __attribute__((בנאי)) תחביר: תחביר GCC המסוים הזה בשימוש עם פונקציה מבצע את אותה פונקציה בהפעלה של התוכנית, כלומר לפני רָאשִׁי() פוּנקצִיָה. 2. __attribute__((הרס)) תחביר: תחביר GCC מסוים זה בשימוש עם פונקציה מבצע את אותה פונקציה ממש לפני שהתוכנית מסתיימת דרך _exit כלומר לאחר רָאשִׁי() פוּנקצִיָה. הֶסבֵּר : הדרך שבה בנאים והרסנים עובדים היא שקובץ האובייקטים המשותף מכיל קטעים מיוחדים (.ctors ו-.dtors ב-ELF) המכילים הפניות לפונקציות המסומנות בתכונות הבנאי וההרס בהתאמה. כאשר הספרייה נטענת/פורקת תוכנת הטעינה הדינמית בודקת אם קיימים קטעים כאלה ואם כן קוראת לפונקציות המוזכרות בהן. כדאי לשים לב לכמה נקודות לגבי אלה: 1. __attribute__((בנאי)) פועל כאשר ספרייה משותפת נטענת בדרך כלל במהלך הפעלת התוכנית. 2. __attribute__((הרס)) פועל כאשר הספרייה המשותפת נפרקת בדרך כלל ביציאת התוכנית. 3. יש להניח ששני הסוגריים נועדו להבדיל בינם לבין קריאות פונקציה. 4. __תְכוּנָה__ הוא תחביר ספציפי ל-GCC; לא פונקציה או מאקרו. קוד נהג : 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  
צור חידון