2011-04-04 84 views
20

我需要在我的C++程序中共享一些字符串。我应该使用#define还是const字符串?感谢const string与#define

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

预处理器只能用于包含守卫,'__FILE__'和类似的内置宏,以及#ifdefs用于平台特定的常量。虽然你可以使用它来定义你的代码实际使用的常量,但下面的答案指出了几个原因,这是一个坏主意。 – 2011-04-05 00:38:59

回答

19

推荐第二个选项。如果使用第一个选项(预处理器),则会限制对象的灵活性。

考虑以下...你将不能够这样比较字符串:

if (str1 == "some string") 
{ 
    // ... 
} 
+0

但你可以这么做: 如果(的std :: string(STR1)== “一些字符串”) { // ... } – traal 2015-04-10 18:50:37

+0

也许一个单独的问题,而是怎么样'常量string' VS'constexpr char []'(因为constexpr不能用于字符串)? – Zitrax 2016-12-14 10:58:14

2

如果你没有使用预处理不要”牛逼!

如果在资源编辑器或清单中需要这些字符串,或者您可能必须使用这些字符串。

5

如果是C++,则应该使用C++标准库的std::string。它比预处理器宏更清晰,它在定义时将在内存中具有单个位置,并且它具有std::string的所有额外功能,而不仅仅是指针比较,与使用预处理器宏创建的隐式const char*一样。

+1

我使用std :: string – user612308 2011-04-05 00:29:25

+1

对不起,我误读'string str1'为const char []'。你真的应该避免使用名称空间标准。 – 2011-04-05 00:47:09

1

你也可以只使用恒定的数据,而不是一个字符串对象一个const char *串,因为对象需要在程序开始时用常量数据进行初始化。如果你不会用字符串做很多事情,只是显示它们或者按照原样打印出来,那就这样做。

所以:

extern const char * str1; 

const char * str1 = "str1"; 
0

我会建议使用的功能。

extern const std::string& str1(); 
extern const std::string& str2(); 

这为您在.cpp文件中获取这些字符串的方式提供了更大的灵活性。

0

另请参考Google C++ style guide中所述的非POD静态构造和破坏顺序问题。

一种替代方法是使用:

const char str1[] = "str1"; 
const char str1[] = "str2"; 
2

要利用的C OO优点++,我会说使用结构/类。

头:

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; 
0

如果是C++而不是C的,你应该使用一些变量,而不是一个预处理器宏。前者比后者更清晰。此外,如果使用C++ 17,则可以使用内联变量:

inline const std::string str = "foobar"; 

// constexpr is implicitly inline 
constexpr const char *str = "foobar"; 

这也是比使用extern更清晰,并且可以在只有报头的API被使用。