Подтвердить что ты не робот

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";
4b9b3361

Ответ 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-интерфейсах только для заголовков.