Si j'ai un fichier d'en-tête foo.h et un fichier source foo.cpp et foo.cpp contient quelque chose le long des lignes de:Routine d'initialisation automatique dans la bibliothèque C++?
#ifdef WIN32
class asdf {
asdf() { startup_code(); }
~asdf() { cleanup_code(); }
};
asdf __STARTUP_HANDLE__
#else
//unix does not require startup or cleanup code in this case
#endif
mais foo.h ne définit pas asdf de classe, dire que j'ai un bar.cpp d'application:
#include "foo.h"
//link in foo.lib, foo.dll, foo.so, etc
int main() {
//do stuff
return 0;
}
Si bar.cpp est compilé sur une plate-forme WIN32, sera le asdf() et ~ asdf() soit appelée au moment opportun (avant main() et à la sortie du programme, respectivement) même si la classe asdf n'est pas définie dans foo.h, mais est liée à travers foo.cpp?
Vous ne nommez pas sérieusement l'objet '__STARTUP_HANDLE__', n'est-ce pas? Tous les noms contenant un trait de soulignement double * ou * commençant par un trait de soulignement suivi d'une lettre majuscule sont réservés à l'implémentation. Le nom peut entrer en conflit avec un certain #define du compilateur ou objet défini par le moteur d'exécution. Jamais * jamais * utilisé des noms comme ça. – jalf