const_seg
pragma
const 変数が格納されているオブジェクト (.obj) ファイル内のセグメントを指定します。
構文
#pragma const_seg(
[ "section-name" [,
"section-class" ] ])
#pragma const_seg(
{push
|pop
} [,
identifier ] [,
"section-name" [,
"section-class" ] ])
パラメーター
push
(省略可能) レコードを内部コンパイラ スタックに格納します。 push
には、identifier と section-name を指定できます。
pop
(省略可能) 内部コンパイラ スタックの最上部からレコードを削除します。 pop
には、identifier と section-name を指定できます。 pop
コマンドを 1 つ使用するだけで、identifier を使用することにより複数のレコードをポップできます。 section-name は、ポップの後にアクティブな const セクション名になります。
identifier
(省略可能) push
と共に使用した場合、内部コンパイラ スタックのレコードに名前を割り当てます。 このディレクティブは、pop
と共に使用した場合に、identifier が削除されるまで、内部スタックからレコードをポップオフします。 identifier が内部スタックに見つからない場合は、何もポップされません。
"section-name"
(省略可能) セクションの名前。 pop
と一緒に使用すると、スタックはポップされて section-name がアクティブな const セクション名になります。
"section-class"
(省略可能) 無視されますが、Microsoft C++ 2.0 より前のバージョンとの互換性を保つために残されています。
解説
オブジェクト ファイル内の section は、メモリへの読み込み単位となる名前付きのデータ ブロックです。 const セクションは、定数データを含むセクションです。 この記事では、セグメントとセクションという用語の意味は同じです。
ディレクティブ const_seg
pragma は、変換単位からすべての定数データ項目を section-name という名前の const セクションに入れるよう、コンパイラに指示します。 const
変数のオブジェクト ファイルの既定のセクションは .rdata
です。 スカラーのような一部の const
変数は、コード ストリームに自動的にインライン展開されます。 インライン化されたコードは .rdata
に表示されません。 section-name パラメーターがない const_seg
pragma ディレクティブは、後続の const
データ項目のセクション名を .rdata
にリセットします。
const_seg
で動的な初期化を必要とするオブジェクトを定義した場合、結果は未定義の動作になります。
セクションを作成する場合に使用してはならない名前のリストについては、「/SECTION
」を参照してください。
初期化されたデータ (data_seg
)、初期化されていないデータ (bss_seg
)、および関数 (code_seg
) のセクションを指定できます。
DUMPBIN.EXE アプリケーションを使用してオブジェクト ファイルを表示できます。 サポートされている各ターゲット アーキテクチャの DUMPBIN のバージョンは Visual Studio に付属しています。
例
// pragma_directive_const_seg.cpp
// compile with: /EHsc
#include <iostream>
const int i = 7; // inlined, not stored in .rdata
const char sz1[]= "test1"; // stored in .rdata
#pragma const_seg(".my_data1")
const char sz2[]= "test2"; // stored in .my_data1
#pragma const_seg(push, stack1, ".my_data2")
const char sz3[]= "test3"; // stored in .my_data2
#pragma const_seg(pop, stack1) // pop stack1 from stack
const char sz4[]= "test4"; // stored in .my_data1
int main() {
using namespace std;
// const data must be referenced to be put in .obj
cout << sz1 << endl;
cout << sz2 << endl;
cout << sz3 << endl;
cout << sz4 << endl;
}
test1
test2
test3
test4