Поделиться через


const_seg

Указывает сегмент, в котором хранятся переменные const в файле .obj.

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

Заметки

Термины сегмент и раздел в этом разделе взаимозаменимы.

OBJ-файлы можно просматривать в приложении dumpbin. По умолчанию для хранения переменных const в OBJ-файле используется сегмент .rdata. Некоторые переменные const, например скаляры, автоматически подставляются в поток кода. Подставляемый код не отображается в сегменте .rdata.

Определение объекта, требующее динамической инициализации в const_seg, приводит к неопределенному поведению.

#pragma const_seg без параметров сбрасывает сегмент до .rdata.

  • push (необязательно)
    Помещает запись во внутренний стек компилятора. push может иметь identifier и segment-name.

  • pop (необязательно)
    Удаляет запись из вершины внутреннего стека компилятора.

  • identifier (необязательно)
    При использовании с директивой push присваивает имя записи во внутреннем стеке компилятора. При использовании с директивой pop записи из внутреннего стека извлекаются до тех пор, пока не будет удален идентификатор identifier; если идентификатор identifier во внутреннем стеке не найден, ничего не извлекается.

    identifier позволяет с помощью одной команды pop вывести сразу несколько записей.

  • "segment-name" (необязательно)
    Имя сегмента. При использовании с pop стек выводится, а segment-name становится активным именем сегмента.

  • "segment-class" (необязательно)
    Включено для обеспечения совместимости с C++ до версии 2.0. Игнорируется.

Пример

// 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;
}
  

Комментарии

Список имен, которые не следует использовать при создании раздела, см. в разделе /SECTION.

Кроме того, можно указать разделы для инициализированных данных (data_seg), неинициализированных данных (bss_seg), а также функций (code_seg).

См. также

Ссылки

Директивы Pragma и ключевое слово __Pragma