const_seg pragma

const 変数が格納されているオブジェクト (.obj) ファイル内のセグメントを指定します。

構文

#pragma const_seg( [ "section-name" [ , "section-class" ] ] )
#pragma const_seg( { push | pop } [ ,identifier ] [ , "section-name" [ , "section-class" ] ] )

パラメーター

push
(省略可能) レコードを内部コンパイラ スタックに格納します。 push には、identifiersection-name を指定できます。

pop
(省略可能) 内部コンパイラ スタックの最上部からレコードを削除します。 pop には、identifiersection-name を指定できます。 pop コマンドを 1 つ使用するだけで、identifier を使用することにより複数のレコードをポップできます。 section-name は、ポップの後にアクティブな const セクション名になります。

識別子
(省略可能) push と共に使用した場合、内部コンパイラ スタックのレコードに名前を割り当てます。 このディレクティブは、pop と共に使用した場合に、identifier が削除されるまで、内部スタックからレコードをポップオフします。 identifier が内部スタックに見つからない場合は、何もポップされません。

"section-name"
(省略可能) セクションの名前。 pop と一緒に使用すると、スタックはポップされて section-name がアクティブな const セクション名になります。

"section-class"
(省略可能) 無視されますが、Microsoft C++ 2.0 より前のバージョンとの互換性を保つために残されています。

解説

オブジェクト ファイル内の section は、メモリへの読み込み単位となる名前付きのデータ ブロックです。 const セクションは、定数データを含むセクションです。 この記事では、セグメントセクションという用語の意味は同じです。

ディレクティブ const_segpragma は、変換単位からすべての定数データ項目を section-name という名前の const セクションに入れるよう、コンパイラに指示します。 const 変数のオブジェクト ファイルの既定のセクションは .rdata です。 スカラーのような一部の const 変数は、コード ストリームに自動的にインライン展開されます。 インライン化されたコードは .rdata に表示されません。 section-name パラメーターがない const_segpragma ディレクティブは、後続の 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

関連項目

pragma ディレクティブと __pragma および _Pragma キーワード