Microsoft 固有の仕様Microsoft Specific

宣言されたグローバル データ項目 (変数またはオブジェクト) が pick-any COMDAT (パッケージ化された関数) であることをコンパイラに指示します。Tells the compiler that the declared global data item (variable or object) is a pick-any COMDAT (a packaged function).


__declspec( selectany ) declarator


リンク時、COMDAT の複数の定義が見つかった場合、リンカーは 1 つを選択し、残りを破棄します。At link time, if multiple definitions of a COMDAT are seen, the linker picks one and discards the rest. 場合、リンカー オプション/OPT:REF (最適化) が選択されている場合は、中間 COMDAT 除去が発生してリンカー出力のすべての参照されないデータ項目を削除し、します。If the linker option /OPT:REF (Optimizations) is selected, then COMDAT elimination will occur to remove all the unreferenced data items in the linker output.

コンストラクター、および宣言におけるグローバル関数または静的メソッドによる代入は参照を作成しないため、/OPT:REF による削除が妨げられません。Constructors and assignment by global function or static methods in the declaration do not create a reference and will not prevent /OPT:REF elimination. このようなコードからの副作用は、データへの他の参照が存在しない時期によって決まりません。Side effects from such code should not be depended on when no other references to the data exist.

動的に初期化されると、グローバル オブジェクト、 selectany未参照のオブジェクトの初期化コードもが破棄されます。For dynamically initialized, global objects, selectany will discard an unreferenced object's initialization code, as well.

グローバル データ項目は、一度だけ EXE または DLL プロジェクトで正常に初期化できます。A global data item can normally be initialized only once in an EXE or DLL project. selectany 1 つ以上のソース ファイルに同じヘッダーが表示されたら、ヘッダーで定義されたグローバル データの初期化に使用されることができます。selectany can be used in initializing global data defined by headers, when the same header appears in more than one source file. selectanyは C および C++ の両方のコンパイラで使用できます。selectany is available in both the C and C++ compilers.


selectanyは外部から参照するグローバル データ項目の実際の初期化にのみ適用できます。selectany can only be applied to the actual initialization of global data items that are externally visible.


このコードは、使用する方法を示します、 selectany属性。This code shows how to use the selectany attribute:

//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 {
X(int i){i++;};
int i;

__declspec(selectany) X x(1);


このコードは、使用する方法を示します、 selectanyデータ COMDAT の圧縮も使用するとことを確認する属性、 /OPT:ICFリンカー オプション。This code shows how to use the selectany attribute to ensure data COMDAT folding when you also use the /OPT:ICF linker option. データをマークする必要がありますに注意してください。 selectanyに置かれていると、 const (読み取り専用) セクション。Note that data must be marked with selectany and placed in a const (readonly) section. 読み取り専用セクションを明示的に指定する必要があります。You must explicitly specify the read-only section.

// 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 固有の仕様はここまでEND Microsoft Specific

関連項目See also