Как определить extern const в конструкторе в C ++ - PullRequest
4 голосов
/ 30 апреля 2019

Два файла config.json содержат значения, которые я хочу сохранить в константах.Мой план состоял в том, чтобы загрузить и проанализировать файл json в конструкторе соответствующих классов и присвоить значения константам.Однако в режиме отладки возникает ошибка «... LNK2019: неразрешенный внешний символ ...».

Итак, невозможно ли определить константы в конструкторе?

Посколькузначения констант зависят от переменной VARIANT, я сделал ifelse, чтобы прочитать правильный файл .json.

// constants.h
extern const int    BARL;
extern const int BAR_TOL;

// constants.cpp
Constants::Constants() {
    Json::Reader reader;
    Json::Value root;

    #if VARIANT == A
        std::ifstream config_a_file("a.json");
        reader.parse(config_a_file, root);
    #elif VARIANT == B
        std::ifstream config_b_file("b.json");
        reader.parse(config_b_file, root);
    #endif

    const int   BARL = root["BARL"].asInt();
    const int   BAR_TOL = BARL * 3;
}

Я ожидаю, что константы BARL и BAR_TOL могут использоваться во всем классе constants.cpp.Тем не менее, их определение не может быть найдено.

1 Ответ

6 голосов
/ 30 апреля 2019

При объявлении внешних переменных область, в которой они отображаются, должна соответствовать области, в которой они определены, уровню уровня имен.И вы вообще не можете определить два глобала с внешней связью в области видимости блока.

Если отложить обсуждение 1 о том, почему вы должны быть осторожны с такими глобальными константами, я бы сказал, что выидем об этом неправильно.Поскольку у вас есть класс Constants, просто предоставьте эти константы как члены и объявите один внешний экземпляр Constants.Что-то вроде:

struct Constants {
    int    BARL;
    int BAR_TOL;
    Constants();
};

extern Constants const constants;

Тогда другой код может иметь дело с лучшим пространством имен constants.BARL, которое само является константой, поскольку является подобъектом объекта const constants.

Соответствующий файл cpp становится таким:

Constants const constants; // definition

Constants::Constants() {
    Json::Reader reader;
    Json::Value root;

    #if VARIANT == A
        std::ifstream config_a_file("a.json");
        reader.parse(config_a_file, root);
    #elif VARIANT == B
        std::ifstream config_b_file("b.json");
        reader.parse(config_b_file, root);
    #endif

    BARL = root["BARL"].asInt(); // assignment
    BAR_TOL = BARL * 3;
}

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

...