Странно, что почти нет онлайн-документации по этому вопросу. У меня есть приложение с жестко закодированными строками для пользовательского интерфейса и различными другими вещами, разбросанными по источнику. Я пытаюсь собрать хотя бы некоторые из них, потому что некоторые из них должны меняться в зависимости от платформы, для которой компилируется приложение.
Я использовал второй пример Вот (скопировано ниже для справки), но это немного освещает детали того, как это на самом деле должно работать. Похоже, что все переинициализировано в project_strings.cpp
и код никогда не вызывается.
// in your project_strings.h
namespace MyProjectStrings {
const char *password;
...
}
// the project_strings.cpp for the strings
#include "project_strings.h"namespace MyProjectStrings {
const char *password = "Password:";
...
}
// some random user who needs that string
#include "project_strings.h"std::string password(MyProjectStrings::password);
Может кто-то объяснить это или сказать мне, что это ужасная идея, и я должен сделать что-то еще?
Пример, на который вы ссылаетесь, просто объявляет const char*
s в пространстве имен в заголовочном файле, а затем определяя их в файле .cpp. Используемый синтаксис некорректен для C ++, хотя объявления в заголовочном файле должны быть extern const char*
скорее, чем const char*
как const
Значения по умолчанию для внутренней связи в C ++.
Большинство наборов инструментов компилятора / компоновщика C ++ помещают все строки из одного блока перевода (project_strings.cpp
) вместе в сегменте данных только для чтения полученного исполняемого файла.
Это разумный, простой подход к обработке статических строк, хотя вы, вероятно, хотите что-то более динамичное / сложное, если вам нужно обрабатывать локализацию или другие сложности.