在 C++ 中,我应该将常量字符串放在哪里:静态类成员还是匿名命名空间? https://stackoverflow.com/questions/2465546/where-do-i-put-constant-strings-in-c-static-class-members-or-anonymous-namesp
#ifndef INCLUDED_EVENT_NAMES
#define INCLUDED_EVENT_NAMES
#pragma once
#include <string_view>
namespace event_names
{
using namespace std::literals;
inline constexpr auto name1 = "value1"sv;
inline constexpr auto name2 = "value2"sv;
}
#endif
Using std::string_view常量而不是简单的const char* or const char[N]意味着您知道每个字符串的长度并且不必依赖于空终止。使用std::string几乎肯定会在运行时产生内存开销和初始化成本。这std::string_view此处定义的 s 将编译为直接引用静态分配的字符串文字对象的代码。即使在多个翻译单元(.cpp 文件)中使用相同的常量,现代编译器几乎肯定只会在二进制文件中存储相同的字符串文字一次(由[词串]/15 http://eel.is/c++draft/lex.string#15)
由于引用不是对象,因此任何人都不可能(意外或以其他方式)执行任何会导致为常量本身创建实际对象的操作(当然字符串文字对象除外)。另外,由于它是一个引用,因此它将携带有关数组大小的信息,以防任何东西都可以利用它(请注意,该大小包括终止 null)。由于仍然存在隐式转换const char*只要需要普通的旧 C 字符串,您就可以使用它们。