selectany

Microsoft-spezifisch

Weist den Compiler an, dass das deklarierte, globale Datenelement (Variable oder Objekt) ein beliebig auswählbares COMDAT (eine Paketfunktion) ist.

Syntax

__declspec( selectany )declarator

Hinweise

Wenn zum Zeitpunkt der Verknüpfung mehrere Definitionen einer COMDAT angezeigt werden, wählt der Linker eine aus und verwirft den Rest. Wenn die Linkeroption /OPT:REF (Optimierungen) ausgewählt ist, tritt die COMDAT-Eliminierung auf, um alle nicht referenzierten Datenelemente in der Linkerausgabe zu entfernen.

Konstruktoren und Zuweisung durch globale Funktion oder statische Methoden in der Deklaration erstellen keine Verweise und verhindern die /OPT: REF-Eliminierung nicht. Nebeneffekte von derartigem Code sollten nicht davon abhängen, ob keine weiteren Verweise auf die Daten vorhanden sind.

Bei dynamisch initialisierten globalen Objekten selectany wird auch der Initialisierungscode eines nicht referenzierten Objekts nicht Karte.

Ein globales Datenelement kann normalerweise nur einmal in einem EXE- bzw. DLL-Projekt initialisiert werden. selectany kann beim Initialisieren von globalen Daten verwendet werden, die von Headern definiert werden, wenn derselbe Header in mehr als einer Quelldatei angezeigt wird. selectany ist sowohl in den C- als auch in C++-Compilern verfügbar.

Hinweis

selectany kann nur auf die tatsächliche Initialisierung globaler Datenelemente angewendet werden, die extern sichtbar sind.

Beispiel: selectany Attribut

Dieser Code veranschaulicht die Verwendung des selectany Attributs:

//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);

Beispiel: Verwenden des selectany Attributs zum Sicherstellen der Daten-COMDAT-Faltung

Dieser Code zeigt, wie Sie das selectany Attribut verwenden, um sicherzustellen, dass daten COMDAT faltbar sind, wenn Sie auch die /OPT:ICF Linkeroption verwenden. Beachten Sie, dass Daten mit selectany einem const (schreibgeschützten) Abschnitt gekennzeichnet und platziert werden müssen. Sie müssen den schreibgeschützten Abschnitt explizit angeben.

// 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;
}

Ende Microsoft-spezifisch

Siehe auch

__declspec
Schlüsselwörter