selectany

Section spécifique à Microsoft

Indique au compilateur que l'élément de données global déclaré (variable ou objet) est un COMDAT pick-any (une fonction packagée).

Syntaxe

__declspec( selectany )declarator

Notes

Au moment d'effectuer le lien, si plusieurs définitions d'un COMDAT s'affichent, l'éditeur de liens en choisit un et ignore le reste. Si l’option /OPT:REF Éditeur de liens (Optimisations) est sélectionnée, l’élimination COMDAT se produit pour supprimer tous les éléments de données non référencés dans la sortie de l’éditeur de liens.

Les constructeurs et l'assignation par fonction globale ou méthodes statiques dans la déclaration ne créent pas de référence et n'empêchent pas la suppression /OPT:REF. Les effets secondaires d'un tel code ne doivent pas créer de dépendances quand il n'existe aucune autre référence à des données.

Pour les objets globaux initialisés dynamiquement carte selectany le code d’initialisation d’un objet non référencé, ainsi.

Un élément de données global ne peut généralement être initialisé qu'une seule fois dans un projet EXE ou DLL. selectany peut être utilisé pour initialiser des données globales définies par des en-têtes, lorsque le même en-tête apparaît dans plusieurs fichiers sources. selectany est disponible dans les compilateurs C et C++.

Remarque

selectany ne peut être appliqué qu’à l’initialisation réelle d’éléments de données globaux visibles en externe.

Exemple : selectany attribut

Ce code montre comment utiliser l’attribut selectany :

//Correct - x1 is initialized and externally visible
__declspec(selectany) int x1=1;

//Incorrect - const is by default static in C++, so
//x2 is not visible externally (This is OK in C, since
//const is not by default static in C)
const __declspec(selectany) int x2 =2;

//Correct - x3 is extern const, so externally visible
extern const __declspec(selectany) int x3=3;

//Correct - x4 is extern const, so it is externally visible
extern const int x4;
const __declspec(selectany) int x4=4;

//Incorrect - __declspec(selectany) is applied to the uninitialized
//declaration of x5
extern __declspec(selectany) int x5;

// OK: dynamic initialization of global object
class X {
public:
X(int i){i++;};
int i;
};

__declspec(selectany) X x(1);

Exemple : Utiliser l’attribut selectany pour garantir le pliage COMDAT des données

Ce code montre comment utiliser l’attribut selectany pour garantir le pliage COMDAT des données lorsque vous utilisez également l’option /OPT:ICF éditeur de liens. Notez que les données doivent être marquées avec selectany et placées dans une const section (en lecture seule). Vous devez spécifier explicitement la section en lecture seule.

// selectany2.cpp
// in the following lines, const marks the variables as read only
__declspec(selectany) extern const int ix = 5;
__declspec(selectany) extern const int jx = 5;
int main() {
   int ij;
   ij = ix + jx;
}

FIN de la section spécifique à Microsoft

Voir aussi

__declspec
Mots clés