Sdílet prostřednictvím


selectany

Specifické pro Microsoft

Říká kompilátoru, že deklarovaná položka globálních dat (proměnná nebo objekt) je vybrána libovolnou sekvencí COMDAT (zabalenou funkcí).

__declspec( selectany ) declarator

Poznámky

Pokud je v době spojení nalezeno více definic sekvencí COMDAT, propojovací program jednu vybere a zbytek zahodí.Pokud je vybrána možnost /OPT:REF (optimalizace) propojovacího programu a poté dojde k sekvenci odstranění COMDAT, což z výstupu propojovacího programu odebere všechny datové položky, na které neexistuje odkaz.

Konstruktory a přiřazení pomocí globálních funkcí nebo statických metod v deklaraci nevytvoří odkaz a nezabrání eliminaci možnosti /OPT:REF.Vedlejší účinky takového kódu by neměly být závislé na tom, zda neexistují žádné odkazy na tato data.

Pro dynamicky inicializované globální objekty atribut selectany také zahodí kód inicializace objektu bez odkazu.

V projektu EXE nebo DLL lze globální datovou položku obvykle inicializovat pouze jednou.Atribut selectany lze použít při inicializaci globálních dat definovaných hlavičkami, když se stejná hlavička objeví ve více než jednom zdrojovém souboru.Atribut selectany je k dispozici v kompilátorech jazyka C i jazyka C++.

[!POZNÁMKA]

Atribut selectany lze použít pouze pro vlastní inicializace globální datové položky, které jsou externě viditelné.

Příklad

Tento kód ukazuje, jak použít atribut 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);

Tento kód ukazuje, jak pomocí atributu selectany zajistit překládání dat sekvence COMDAT při současném použití možnosti /OPT:ICF propojovacího programu.Všimněte si, že data musí být označena atributem selectany a umístěna v části const (jen pro čtení).Část jen pro čtení je nutné explicitně zadat.

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

Specificka produktu Microsoft END

Viz také

Referenční dokumentace

__declspec

Klíčová slova jazyka C++