Я использую init_seg
для управления созданием трех объектов класса C++. Каждый объект находится в другом исходном файле/единице перевода. Отладка показывает, что объекты создаются, как и ожидалось, во время инициализации CRT.
Объекты инициализируются в алфавитном порядке их исходного файла. Я хотел бы изменить его, потому что это не совсем правильно. Я посетил страницу MSDN на init_seg
, и там указано, что используется:
#pragma init_seg({ compiler | lib | user | "section-name" [, func-name]} )
Похоже, что использование lib
и section-name
является взаимоисключающим, поэтому мне не ясно, как использовать init_seg(lib)
и указать имя раздела/группы, чтобы получить правильный алфавитный порядок.
Когда я пытаюсь использовать алфавитную строку для управления порядком:
#pragma init_seg(lib, "01")
Это приводит к предупреждению, которое, как я предполагаю, означает, что все будет работать не так, как ожидалось:
warning C4081: expected ')'; found ','
Когда я пытаюсь вставить непосредственно в код запуска CRT напрямую, используя ".CRT$XCB"
, ".CRT$001"
и ".CRT$XCB001"
(и другие варианты использования алфавита):
#pragma init_seg(".CRT$XCB")
Это приводит к другому предупреждению, которое, как я предполагаю, означает, что все будет работать не так, как ожидалось:
warning C4075: initializers put in unrecognized initialization area
Я нашел один вопрос об этом в Stack Overflow, но ответ был предположением и не охватывает несколько единиц перевода. Я также нашел архив KB104248 на Wayback Machine, но это тоже не очень помогает, потому что показывает только использование compiler
, lib
и user
.
Итак, мой вопрос: как мне использовать init_seg
для управления точным порядком создания моих трех объектов в трех разных исходных файлах?
init_priority
, но мне нужно признаться, я не устанавливаю связь междуmine$a
и.mine$z
, распределениями и заменой кода запуска. Стандартный запуск ЭЛТ кажется адекватным. Мне нужно только вставить три моих объекта в определенном порядке. - person jww   schedule 20.03.2017init_seg(lib)
, конструктор и деструктор для этого объекта будут запущены автоматически, и оттуда вы сможете вызывать конструкторы и деструкторы для различных именованных разделов в желаемом порядке. - person Harry Johnston   schedule 20.03.2017func-name
в вызовеinit_seg
. Это позволяет вам контролировать разрушение, но кажется необязательным. Вам, наверное, это не нужно. Просто вызовите конструкторы при запуске и позвольте CRT вызывать деструкторы, как обычно. - person Harry Johnston   schedule 20.03.2017