const_seg pragma

指定 .obj 文件中存储 const 变量的区域(段)。

语法

#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。 通过使用 identifier,你只需使用一个 pop 命令即可弹出多条记录分区名称在弹出后成为活动的 const 分区名称。

identifier
(可选)当与 push 一起使用时,为内部编译器堆栈上的记录指定名称。 与 pop 一起使用时,此指令会从内部堆栈弹出记录,直到移除 identifier 为止。 如果在内部堆栈上未发现 identifier,则不会弹出任何内容。

"section-name"
(可选)分区的名称。 与 pop 一起使用时,将弹出堆栈,分区名称成为活动 const 分区名称。

"section-class"
(可选)已忽略,但包含在内以便与 2.0 版之前的 Microsoft C++ 版本兼容。

备注

对象文件中的分区是作为单元加载到内存的已命名数据块。 const 分区是包含常量数据的分区。 在本文中,术语“段”和“节”的含义相同

const_segpragma 指令指示编译器将所有常量数据项从转换单元放入名为 section-name 的 const 分区中。 const 变量的对象文件中的默认分区为 .rdata。 某些 const 变量(如标量)将自动内联到代码流中。 内联代码不会出现在 .rdata 中。 不带分区名称参数的 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 关键字