我需要在我的c ++程序中共享一些字符串。我应该使用#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";
答案 0 :(得分:23)
首选第二种选择。如果使用第一个选项(预处理器),则限制了对象的灵活性。
请考虑以下内容......您将无法以这种方式比较字符串:
if (str1 == "some string")
{
// ...
}
答案 1 :(得分:5)
如果是C ++,则应使用C ++标准库的std::string
。它比预处理器宏更清晰,它在定义时在内存中只有一个位置,并且它具有std::string
的所有额外功能,而不仅仅是指针比较,就像隐式{{1}一样。使用预处理器宏创建的。
答案 2 :(得分:3)
为了获得c ++的优势,我想说使用struct / class。
头:
struct Constants {
static const string s1;
static const string s2;
};
CPP:
const string Constants::s1 = "blah1";
const string Constants::s2 = "blah2";
参考:
cout << Constants::s1 << endl;
答案 3 :(得分:2)
如果您不必使用预处理器,请不要!
如果资源编辑器或清单中需要这些字符串,或者您可能需要这些字符串。
答案 4 :(得分:2)
如果它是C ++而不是C,那么你应该使用一些变量而不是预处理器宏。前者比后者更清楚。此外,如果使用C ++ 17,则可以使用内联变量:
inline const std::string str = "foobar";
或
// constexpr is implicitly inline
constexpr const char *str = "foobar";
这比使用extern
更清晰,也可以在仅限标题的API中使用。
答案 5 :(得分:1)
你也可以只使用const char *字符串来表示常量数据而不是字符串对象,因为无论如何都需要在程序开头使用常量数据初始化该对象。如果您不打算使用字符串,只是显示它们或按原样打印它们,请执行此操作。
所以:
extern const char * str1;
和
const char * str1 = "str1";
答案 6 :(得分:0)
我建议使用函数。
extern const std::string& str1();
extern const std::string& str2();
这使您可以更灵活地在.cpp文件中获取这些字符串。
答案 7 :(得分:0)
还要考虑非POD静态构造和销毁顺序的问题,如Google C++ style guide中所述。
另一种方法是使用:
const char str1[] = "str1";
const char str1[] = "str2";