Retired Document
Important: This document may not represent best practices for current development. Links to downloads and other resources may no longer be valid.
Deprecated CALL_ON_[UN]LOAD pragmas
Q: I'm trying to build an old project that used the CALL_ON_LOAD and CALL_ON_UNLOAD pragmas and I'm getting warnings that these pragmas are deprecated and that I should use constructor and destructor attributes instead. What are constructor and destructor attributes?
A: The CALL_ON_LOAD and CALL_ON_UNLOAD #pragmas were added to GCC by Apple prior to the release of Mac OS X 10.0. They were used to specify routines to be called when a dynamic library was loaded or unloaded. They have now been deprecated and replaced by the constructor and destructor function attributes. A function with the constructor attribute is called when a dynamic library is loaded. Similarly, a function with the destructor attribute is called when a dynamic library is unloaded. When the constructor or destructor function is called, the return value of the function is ignored, and any parameters of the function are undefined. Note: This is a syntactical change for the compiler only; the pragmas and the attributes generate binary compatible code.
The constructor and destructor attributes are supported by gcc as of version 2.5.
Listing 1 Using #pragmas (deprecated, don't use)
// (deprecated, don't use) #pragma CALL_ON_LOAD my_mod_init_func static void my_mod_init_func(void) { /* do my init stuff */ } #pragma CALL_ON_UNLOAD my_mod_term_func static void my_mod_term_func(void) { /* do my termination stuff */ } |
Listing 2 Using constructor and destructor attributes
void MyInitFunc(void) __attribute__ ((constructor)) { /* do my init stuff */ } void MyTermFunc(void) __attribute__ ((destructor)) { /* do my termination stuff */ } |
Listing 3 Using constructor and destructor attributes with gcc 4.0
extern void MyInitFunc(void) __attribute__ ((constructor)); extern void MyTermFunc(void) __attribute__ ((destructor)); void MyInitFunc(void) { /* do my init stuff */ } void MyTermFunc(void) { /* do my termination stuff */ } |
Document Revision History
Date | Notes |
---|---|
2006-01-10 | |
2005-08-10 | Adding gcc 4.0 information |
2005-07-05 | New document that replace deprecated CALL_ON_[UN]LOAD pragmas with constructor [destructor] function attributes. |
Copyright © 2006 Apple Computer, Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2006-01-10