如何存储将被多个不同类访问的字符串常量? [关闭]

2024-05-08

关于堆栈溢出有太多不同的答案:

  1. 声明一个命名空间,并在 hpp 文件中将所有字符串标记为 extern const,并在 cpp 文件中放置它们的定义。

    C++ 如何在 cpp 之间与 extern 共享常量 - 错误:指定存储类 https://stackoverflow.com/questions/34578993/c-how-to-share-constants-with-extern-between-cpp-error-storage-class-specif

  2. 使用 static const 代替 extern const:

    https://softwareengineering.stackexchange.com/questions/351827/is-it-bad-practice-to-define-constants-using-class-static-methods https://softwareengineering.stackexchange.com/questions/351827/is-it-bad-practice-to-define-constants-using-class-static-methods

  3. 使用内联函数:

    类中的静态字符串常量与常量的命名空间 [c++] https://stackoverflow.com/questions/3670031/static-string-constants-in-class-vs-namespace-for-constants-c

  4. 使用匿名命名空间!

    在 C++ 中,我应该将常量字符串放在哪里:静态类成员还是匿名命名空间? https://stackoverflow.com/questions/2465546/where-do-i-put-constant-strings-in-c-static-class-members-or-anonymous-namesp

这一切真的很令人困惑。使用内联函数似乎是返回字符串常量的一种非常冗长乏味的方法。

为什么我们不能只使用包含 cpp 文件中定义的静态字符串的命名空间?

有人可以提供一个明确/明确的答案,说明如何将字符串存储在常量文件中,以便多个 cpp 文件可以访问它们吗?

编辑: 在 C# 和 Java 中,将所有常量存储在“常量”文件中似乎不是问题。在 C++ 中执行此操作的最简单方法是什么?

编辑:Java 中的这些答案似乎具体且易于理解。在 C++ 中,尚不清楚哪种方式可能具有最少的编译时间、最少的运行时内存使用量。

在多个类之间共享 Java 中的常量字符串? https://stackoverflow.com/questions/10896111/sharing-constant-strings-in-java-across-many-classes

https://dzone.com/articles/constants-in-java-the-anti-pattern-1 https://dzone.com/articles/constants-in-java-the-anti-pattern-1


这个问题太宽泛,无法回答。但是根据评论中给出的有关应用程序性质(内部用于注册事件的名称)的进一步说明,我可能会建议使用类似这样的标头

#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)

如果您坚持使用 C++11,那么最简单的方法(并且很可能足以满足您需要做的事情)只需为您需要的字符串文字对象创建一些命名引用:

#ifndef INCLUDED_EVENT_NAMES
#define INCLUDED_EVENT_NAMES

#pragma once

namespace event_names
{
    constexpr auto& name1 = "value1";
    constexpr auto& name2 = "value2";
}

#endif

由于引用不是对象,因此任何人都不可能(意外或以其他方式)执行任何会导致为常量本身创建实际对象的操作(当然字符串文字对象除外)。另外,由于它是一个引用,因此它将携带有关数组大小的信息,以防任何东西都可以利用它(请注意,该大小包括终止 null)。由于仍然存在隐式转换const char*只要需要普通的旧 C 字符串,您就可以使用它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何存储将被多个不同类访问的字符串常量? [关闭] 的相关文章

  • 为什么在连接两个字符串时 Python 比 C 更快?

    目前我想比较 Python 和 C 用来处理字符串的速度 我认为 C 应该比 Python 提供更好的性能 然而 我得到了完全相反的结果 这是 C 程序 include
  • 适合初学者的良好调试器教程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有谁知道一个好的初学者教程 在 C 中使用调试器 我感觉自己好像错过了很多 我知道怎么做 单步执行代码并查看局部变量 虽然这常常给我带来问
  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • GetType() 在 Type 实例上返回什么?

    我在一些调试过程中遇到了这段代码 private bool HasBaseType Type type out Type baseType Type originalType type GetType baseType GetBaseTyp
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 为什么在 WebApi 上下文中在 using 块中使用 HttpClient 是错误的?

    那么 问题是为什么在 using 块中使用 HttpClient 是错误的 但在 WebApi 上下文中呢 我一直在读这篇文章不要阻止异步代码 https blog stephencleary com 2012 07 dont block
  • Visual Studio 在构建后显示假错误

    我使用的是 Visual Studio 2017 构建后 sln在调试模式下 我收到错误 但是 当我通过双击错误列表选项卡中的错误来访问错误时 错误会从页面中消失 并且错误数量也会减少 我不太确定这种行为以及为什么会发生这种情况 有超过 2
  • 使用可变参数包类型扩展的 C++ 函数调用者包装器

    我绑定了一些 API 并且绑定了一些函数签名 如下所示 static bool WrapperFunction JSContext cx unsigned argc JS Value vp 我尝试将对象和函数包装在 SpiderMonkey
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 为什么可以通过ref参数修改readonly字段?

    考虑 class Foo private readonly string value public Foo Bar ref value private void Bar ref string value value hello world
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件
  • Objective-C / C 给出枚举默认值

    我在某处读到过关于给枚举默认值的内容 如下所示 typedef enum MarketNavigationTypeNone 0 MarketNavigationTypeHeirachy 1 MarketNavigationTypeMarke
  • 灵气序列解析问题

    我在使用 Spirit Qi 2 4 编写解析器时遇到一些问题 我有一系列键值对以以下格式解析
  • 如何使用 C++11 using 语法键入定义函数指针?

    我想写这个 typedef void FunctionPtr using using 我该怎么做呢 它具有类似的语法 只不过您从指针中删除了标识符 using FunctionPtr void 这是一个Example http ideone

随机推荐