selectany
Microsoft-spezifisch
Weist den Compiler an, dass das deklarierte Datenelement (globale Variable oder ein Objekt) Auswahl-irgendein COMDAT ist (eine Paketfunktion).
__declspec( selectany ) declarator
Hinweise
An der Verknüpfungszeit wenn mehrere Definitionen einer COMDAT angezeigt werden, wählt der Linker ein aus und verwirft den Rest.Wenn die Linkeroption /OPT: REF (Optimizations) ausgewählt ist, dann tritt auf COMDAT-Beseitigung auf, um alle Datenelemente in der Linker die Ausgabe zu entfernen.
Konstruktoren und Zuweisung von globale Funktion oder statische Methoden in der Deklaration erstellt werden und kein Verweis nicht /OPT: VerhindernREF-Beseitigung.Nebeneffekte von solchem Code sollten nicht von abgehangen werden, wenn keine weiteren Verweise auf den Daten basieren.
Für die dynamisch initialisiert, globalen Objekten selectany Initialisierung eines Objekts, nicht verwiesen werden.
Ein globales Datenelement kann in einer EXE- bzw. DLL-Projekt normalerweise nur einmal initialisiert werden.selectany kann verwendet werden, wenn die globalen Daten initialisiert, die durch Header definiert werden, wenn der gleiche Header in mehr als einer Quellcodedatei wird.selectany ist in den Programmiersprachen C und C++-Compilern verfügbar.
Hinweis |
---|
selectany kann zur eigentlichen Initialisierung globaler Datenelementen nur angewendet werden, die extern sichtbar sind. |
Beispiel
Dieser Code zeigt, wie das selectany-Attribut verwendet:
//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);
Dieser Code zeigt, wie das selectany-Attribut verwendet wird, um die Faltung der Daten COMDAT zu gewährleisten, wenn Sie auch die /OPT: ICF - Linkeroption verwenden.Beachten Sie, dass der Daten mit selectany markiert wurden, und einen Abschnitt const (schreibgeschützter) eingefügt 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;
}
Microsoft ENDES bestimmten