const string vs. #define

use*_*308 28 c++

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

mystring1.h

#define str1 "str1"
#define str2 "str2"    
Run Code Online (Sandbox Code Playgroud)

或者
mystring2.h

extern const string str1;  
extern const string str2;  
Run Code Online (Sandbox Code Playgroud)

mystring.cpp

const string str1 = "str1";  
const string str2 = "str2";
Run Code Online (Sandbox Code Playgroud)

Mar*_*lon 25

喜欢第二种选择.如果使用第一个选项(预处理器),则限制了对象的灵活性.

请考虑以下内容......您将无法以这种方式比较字符串:

if (str1 == "some string")
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*ias 8

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

inline const std::string str = "foobar";
Run Code Online (Sandbox Code Playgroud)

或者

// constexpr is implicitly inline
constexpr char str0[] = "foobar";
constexpr const char* str1 = "foobar";
constexpr std::string_view str2 = "foobar";
Run Code Online (Sandbox Code Playgroud)

这也比 using 更清晰extern,也可以在仅标头的 API 中使用。


Set*_*son 5

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

  • 对不起,我把`string str1`误读为`const char []`.你真的应该避免使用命名空间std`. (3认同)

小智 5

为了利用 C++ 的 OO 优势,我会说使用 struct/class。

标题:

struct Constants {
    static const string s1;
    static const string s2;
};
Run Code Online (Sandbox Code Playgroud)

cp:

const string Constants::s1 = "blah1";
const string Constants::s2 = "blah2";
Run Code Online (Sandbox Code Playgroud)

参考:

cout << Constants::s1 << endl;
Run Code Online (Sandbox Code Playgroud)

  • 为什么不使用“命名空间”而不是“结构”?(我可以想到一个原因 - 为“常量”创建类型别名的能力 - 但我不明白为什么它会在这里产生影响。) (2认同)