Syntaxe
[C++]#pragma package(smart_init)
#pragma package(smart_init, weak)
Description : smart_init argument
#pragma package(smart_init) garantit l'initialisation des unités packagées dans l'ordre déterminé par leurs dépendances. Incluse par défaut dans le fichier source d'un package. Typiquement, vous utilisez #pragma package pour les fichiers .CPP construits comme des packages.
Cette directive pragma affecte l'ordre d'initialisation de l'unité de compilation. Pour les unités, l'initialisation se produit dans l'ordre suivant :
1. Selon leur dépendances "d'usage". Ainsi, si l'unitéA dépend de l'unitéB, l'unitéB doit être initialisée avant l'unitéA.
2. Selon l'ordre de lien.
3. Selon l'ordre de priorité dans l'unité.
Pour les fichiers objet normaux (ceux non construits comme des unités), l'initialisation se produit d'abord en fonction de l'ordre de priorité puis de l'ordre de lien. La modification de l'odre de lien des fichiers objet modifie l'ordre dans lequel les constructeurs d'objets globaux sont appelés.
Les exemples suivants illustrent en quoi l'initialisation des unités diffère de celle des fichiers objet normaux.
Supposons trois fichiers unité, A, B et C, initialisés de façon "intelligente" avec #pragma package(smart_init) et ont les valeurs de priorité (définies par le paramètre de priorité de #pragma startup) 10, 20 et 30. Les noms des fonctions sont déterminés par leur valeur de priorité et le fichier objet parent : a10, a20, a30, b10, etc.
Puisque les trois fichiers sont des unités, et en supposant que A utilise B et C et que l'ordre de lien est A, B puis C, l'ordre d'initialisation est :
B10 B20 B30 C10 C20 C30 A10 A20 A30
S'il s'agissait de fichiers objet, et non d'unités, l'ordre serait :
A10 B10 C10 A20 B20 C20 A30 B30 C30
Toutes les références #pragma link à d'autres fichiers objet à partir d'un fichier .cpp utilisant et déclarant #pragma package(smart_init) doivent aussi être résolues par une unité. Les références #pragma link à des fichiers non objet peuvent néanmoins être résolues par des bibliothèques, etc.
Description : weak packages
La directive #pragma package(smart_init, weak) affecte la manière dont un fichier objet est stocké dans les fichiers .bpi et .bpl d'un package. Si #pragma package(smart_init, weak) apparaît dans un fichier d'unité, le compilateur ne place pas l'unité dans les fichiers bpl si c'est possible, et il crée une copie locale non empaquetée de l'unité si elle est nécessaire à une autre application ou un autre package. Une unité compilée avec cette directive est dite faiblement empaquetée.
#pragma package(smart_init, weak) est utilisée pour éliminer les conflits entre packages pouvant dépendre de la même bibliothèque externe.
Les fichiers d'unités contenant la directive #pragma package(smart_init, weak) ne doivent pas contenir de variables globales.
Pour de plus amples informations, voir la rubrique Faible packaging.
Partager