разрешение статической переменной во время сборки - PullRequest
0 голосов
/ 06 января 2012

У меня есть файлы, которые связаны между собой:

basic.h

#pragma once

extern const string APPLICATION_NAME;

application.cpp

#include "basic.h"

const string APPLICATION_NAME = "MyApplication";

............

ErrorTables.h

class ErrorTable
{
public:
    ErrorTable();

private:
    map <index, errorRecord> _errorTable;


};

ErrorTables.cpp

#include "basic.h"

ErrorTable TheErrorTable;

ErrorTable::ErrorTable()
{
   ...
   _errorTable[errorIndex] = errorRecord(APPLICATION_NAME + " hit some error.");
   ...
}

Этот код можно построить и запустить нормально в Visual Studio. Когда я использую GCC, он может быть собран, но не выполнен во время выполнения. Проблема в TheErrorTable, который имеет статическую связь и создан до запуска main (); он не может разрешить переменную APPLICATION_NAME. Если я скрываю это используя локальную переменную, все работает хорошо.

Есть ли флаг GCC, который вызывает разрешение статической переменной во время сборки или реализует поведение Visual Studio другим способом?

1 Ответ

2 голосов
/ 06 января 2012

Проблема в TheErrorTable, которая имеет статическую связь и создается до запуска main ();он не может разрешить переменную APPLICATION_NAME.

Это верно. Сначала * инициализируется TheErrorTable или APPLICATION_NAME, и вы не можете это исправить.


Сделать ErrorTable не будь глобальным.Вы не можете определить порядок статической инициализации между TU, и даже если бы вы могли просто сделать код сложнее , чтобы следовать.

Я не хочу это говорить, но ErrorTableздесь может быть полезен шаблон синглтона (потому что функции - static s имеют нормальный порядок инициализации), по крайней мере, настолько, насколько это решение наиболее близко к существующему коду.


Обновление

Как намекал @godexsoft, вы можете обойти это, воспользовавшись постоянной инициализацией и сделав APPLICATION_NAME a char const* вместо std::string;тогда ваш инициализатор будет инициализатором с постоянным выражением без вызова конструктора и, как таковой, будет вызываться - через TU - до гарантированного ErrorTable.( Действительно? Да. )

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