常量字符串与 #define

const string vs. #define

本文关键字:#define 字符串 常量      更新时间:2023-10-16

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

我的字符串1.h

#define str1 "str1"
#define str2 "str2"    


我的字符串2.h

extern const string str1;  
extern const string str2;  

我的字符串.cpp

const string str1 = "str1";  
const string str2 = "str2";

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

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

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

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

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

// constexpr is implicitly inline
constexpr char str0[] = "foobar";
constexpr const char* str1 = "foobar";
constexpr std::string_view str2 = "foobar";

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

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

为了利用 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;

如果您不必使用预处理器,请不要使用!

如果资源编辑器或清单或其他内容中需要这些字符串,则可能需要这样做。

您也可以只对常量数据使用 const char* 字符串,而不是字符串对象,因为无论如何都需要在程序开始时使用常量数据初始化该对象。如果您不打算对字符串做太多事情,而只是按原样显示它们或打印它们,请执行此操作。

所以:

extern const char * str1;

const char * str1 = "str1";

我建议使用函数。

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

这使您可以更灵活地在.cpp文件中获取这些字符串。

还要考虑非 POD 静态构造和销毁顺序的问题,如 Google C++ 风格指南中所述。

另一种方法是使用:

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