const_seg
pragma
指定 .obj 文件中存储 const 变量的区域(段)。
语法
#pragma const_seg(
[ "section-name" [,
"section-class" ] ])
#pragma const_seg(
{push
|pop
} [,
标识符 ] [,
“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_seg
pragma 指令指示编译器将所有常量数据项从转换单元放入名为 section-name 的 const 分区中。 const
变量的对象文件中的默认分区为 .rdata
。 某些 const
变量(如标量)将自动内联到代码流中。 内联代码不会出现在 .rdata
中。 不带分区名称参数的 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