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
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für