Const string vs. #define
Мне нужно поделиться некоторыми строками в моей программе на С++. Должен ли я использовать #define или const string? спасибо
mystring1.h
#define str1 "str1"
#define str2 "str2"
Или
mystring2.h
extern const string str1;
extern const string str2;
mystring.cpp
const string str1 = "str1";
const string str2 = "str2";
Ответы
Ответ 1
Предпочитает второй вариант. Если вы используете первый вариант (препроцессор), вы ограничиваете свою гибкость с помощью объекта.
Рассмотрим следующее... Вы не сможете сравнить строки таким образом:
if (str1 == "some string")
{
// ...
}
Ответ 2
Если это С++, вы должны использовать стандартную библиотеку С++ std::string
. Это гораздо более ясно, чем макрос препроцессора, он будет иметь одно место в памяти, когда он будет определен, и имеет все дополнительные функции std::string
вместо сравнения только с указателями, как в случае с неявным const char*
, который создается с макросом препроцессора.
Ответ 3
Если вам не нужно использовать препроцессор, не делайте этого!
Если эти строки необходимы в редакторе ресурсов или манифеста или что-то, что вам может понадобиться.
Ответ 4
Чтобы использовать OO-преимущество С++, я бы сказал, используйте struct/class.
Заголовок:
struct Constants {
static const string s1;
static const string s2;
};
каст:
const string Constants::s1 = "blah1";
const string Constants::s2 = "blah2";
Ссылка:
cout << Constants::s1 << endl;
Ответ 5
Вы также можете использовать строку const char * для постоянных данных, а не для строкового объекта, так как объект должен быть инициализирован в начале программы с постоянными данными в любом случае. Сделайте это, если вы не будете делать много со строками, но просто показываете их или распечатываете, как есть.
Итак:
extern const char * str1;
и
const char * str1 = "str1";
Ответ 6
Я бы предложил использовать функции.
extern const std::string& str1();
extern const std::string& str2();
Это дает вам больше гибкости в том, как вы получаете эти строки в файле .cpp.
Ответ 7
Также рассмотрите вопрос о статическом построении и порядке уничтожения не-POD, как описано в Руководстве по стилю Google С++.
Альтернативой является использование:
const char str1[] = "str1";
const char str1[] = "str2";
Ответ 8
Если это С++ вместо C, вы должны использовать некоторую переменную вместо макроса препроцессора. Первый более ясный, чем последний. Кроме того, если вы используете С++ 17, вы можете использовать встроенные переменные:
inline const std::string str = "foobar";
или
// constexpr is implicitly inline
constexpr const char *str = "foobar";
Это также более понятно, чем использование extern
и может использоваться также в API-интерфейсах только для заголовков.