const string vs. #define

时间:2011-04-04 23:40:51

标签: c++

我需要在我的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";

8 个答案:

答案 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";