Обнаружить этап статической инициализации? - PullRequest
0 голосов
/ 19 ноября 2009

Что я действительно хочу, так это как узнать, когда каждая стадия инициализации C ++ действительно СДЕЛАНА?

При статической инициализации назначаются простые вещи. Затем происходит динамическая статическая инициализация, при которой присваивается более сложная статика, которая не определяется в «единицах перевода». Это ужасно, и не так много простых способов справиться. Я использую пространства имен в местах, чтобы сделать немедленное назначение, которое происходит при загрузке файлов заголовков, но недостатком здесь является то, что это может быть перезаписано на одном из этапов инициализации.

Я могу установить инициализацию как функцию, которая делает «правильные вещи», но было бы намного проще, если бы я мог ЗНАТЬ, в какой «фазе» я нахожусь. Насколько я могу судить, это никак не возможно, но я надеюсь, что у кого-то будут хорошие новости.

Я обошел проблему, вызвавшую это: код, который не использовался, был неожиданно связан, потому что он был в проекте. Было бы неплохо узнать ответ на этот вопрос, но я предполагаю, что ответ «нет способа узнать наверняка».

Я редактировал вопрос, я не очень хочу знать, что main запускается как таковой.

Ответы [ 4 ]

3 голосов
/ 19 ноября 2009

Я не понимаю, какую проблему вы пытаетесь решить.

Когда вы создаете свое приложение, компоновщик добавляет код запуска, который является первым кодом, который выполняется, когда ОС загружает вашу программу в память. Этот код выполнит всю работу по инициализации и, когда закончит, вызовет вашу функцию main ().

Если вы говорите о замене этого кода вашим собственным, вам следует проверить внутренние детали вашего компилятора / компоновщика (и быть уверенным, что вы знаете, что делаете !!).

Если ваш вопрос касается нескольких процессов, и вам необходимо знать, запущен ли один из процессов, вам следует использовать надлежащий механизм синхронизации (это может быть один из тех, которые предоставляются базовой ОС, или тот, который вы создаете самостоятельно) .

1 голос
/ 19 ноября 2009

как насчет этого:

bool is_started(bool set_started=false){
  static bool flag = false;
  if(set_started)
     flag=true;
  return flag;
}

main(){
  is_started(true);
}
0 голосов
/ 19 ноября 2009

если вы работаете в Windows, создайте mutex после завершения инициализации. Затем вы можете WaitForSingleOject на этом мьютексе, чтобы определить, действительно ли ваша программа инициализирована.

Многие приложения делают это, чтобы определить, завершен ли запуск, и каков другой экземпляр приложения. Это особенно верно, если вы хотите запустить только 1 экземпляр программы.

0 голосов
/ 19 ноября 2009

Если ваш вопрос касается окон, я знаю, что вы можете обнаружить помпу сообщения из запущенного процесса Таким образом, вы точно знаете, что все инициализировано.

Конечно, это не летит для * nix

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...