头文件中的 const 变量和静态初始化惨败

2024-03-10

在阅读了很多有关静态变量初始化的问题后,我仍然不确定这如何适用于const命名空间级别的变量。

我有以下代码header file config.h由构建脚本生成:

static const std::string path1 = "/xyz/abc";
static const std::string path2 = "/etc";

根据我读到的static关键字不是必需的,甚至在这里已弃用。

我的问题:上面的代码容易出现静态初始化失败吗?

如果我有以下内容header file myclass.h:

class MyClass
{
public:
    MyClass(const std::string& str) : m_str(str) {}
    std::string Get() const { return m_str; }

private:
    std::string m_str;
}

const MyClass myclass1("test");

这会给静态初始化带来任何问题吗?

如果我理解正确的话,由于const具有内部链接的变量在这两种情况下都应该没有问题吗?

Edit:(由于dribeas的回答)

也许我应该提到我对以下用例感兴趣:

In main.cpp:

#include <config.h>
#include <myclass.h>

std::string anotherString(path1 + myclass1.Get());

int main()
{
    ...
}

关于此用例的另一个问题:编译器会优化掉吗path2在这种情况下?


您的第一个定义位置path1在每个编译单元中包括config.h。为了避免这种情况,不要在头文件中定义变量。通常您会将标头中的变量声明为extern:

extern const std::string path1;
extern const MyClass myclass1;

并在翻译单元中定义它们,例如config.cpp:

const std::string path1 = "/xyz/abc";
const MyClass myclass1("test");

有时您需要一个只能在一个翻译单元中使用的常量变量。然后您可以在文件范围内将该变量声明为static.

static const std::string path1 = "/xyz/abc";

static不再弃用。static and extern有时是隐含的,但我总是忘记在哪里以及如何,所以我通常为所有名称空间级变量显式指定它们。

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

头文件中的 const 变量和静态初始化惨败 的相关文章

  • 使用 mono/nunit-console/4 在 Mac OS X 控制台上运行测试

    我安装了 Max OS X 10 11 1 上面装有 Xamarin 我编写了简单的测试类 只是为了测试在 Mac OS X 和 Ubuntu 上运行 Nunit 测试 该类实际上有一个返回字符串的方法 using System names
  • 在 C/C++ 中获得正模数的最快方法

    通常在我的内部循环中 我需要以 环绕 方式索引数组 因此 例如 如果数组大小为 100 并且我的代码要求元素 2 则应该给它元素 98 高级语言 例如 Python 可以简单地使用my array index array size 但由于某
  • 有没有快速创建集合的方法?

    目前我正在创建一个像这样的新集 std set a s s insert a1 s insert a2 s insert a3 s insert a10 有没有办法创建s在一行 int myints 10 20 30 40 50 std s
  • QCombobox 向下箭头图像

    如何更改Qcombobox向下箭头图像 现在我正在使用这个 QSS 代码 但这不起作用 我无法删除向下箭头边框 QComboBox border 0px QComboBox down arrow border 0px background
  • 在 C# 中按元素相乘数组具有意想不到的性能

    我想找到按元素相乘两个数组的最佳方法 这是更广泛项目的一部分 其中性能而不是唯一的考虑因素 我今天开始用 C Linqpad 编写一些函数 因此它还没有以任何方式进行优化 下面代码的输出如下 Environment ProcessorCou
  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • EF Core 通过完全替换断开集合导航属性的更新

    使用 EF Core 5 0 我有一个 SPA 页面 可以加载Group实体及其集合Employee来自 API 的实体 var groupToUpdate await context Groups Include g gt g Emplo
  • 读取 C# 中的默认应用程序设置

    我的自定义网格控件有许多应用程序设置 在用户范围内 其中大部分是颜色设置 我有一个表单 用户可以在其中自定义这些颜色 并且我想添加一个用于恢复默认颜色设置的按钮 如何读取默认设置 例如 我有一个名为的用户设置CellBackgroundCo
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 动态生成的控件 ID 返回为 NULL

    我可以在 Page PreInit 函数中创建动态控件 如何检索控件及其 ID 我的 C 代码用于创建动态控件之一 var btn new WebForms Button btn Text btn ID Addmore btn Click
  • 在 JSQMessagesViewController 中显示 LocationMediaItem

    我刚刚尝试实施LocationMediaItem in my Xamarin iOS应用程序使用JSQMessagesViewController 一切都很顺利 唯一的问题是UICollectionView应该显示位置的单元格永远停留在加载
  • 为什么 set_symmetry_difference 无法与比较器一起使用?

    Example program include
  • Visual Studio Code:如何配置 includePath 以获得更好的 IntelliSense 结果

    我是使用 Visual Studio Code 的完全初学者 我不知道我在做什么 我已经四处搜索 也许还不够 但我找不到像我这样的人如何配置的简单解释c cpp properties json每当我单击带有绿色波浪线下划线的行旁边的黄色灯泡
  • std::forward_as_tuple 将参数传递给 2 个构造函数

    我想传递多个参数以便在函数内构造两个对象 以同样的方式std pair
  • 将标量添加到特征矩阵(向量)

    我刚刚开始使用 Eigen 库 无法理解如何向所有矩阵成员添加标量值 假设我有一个矩阵 Eigen Matrix3Xf mtx Eigen Matrix3Xf Ones 3 4 mtx mtx 1 main cxx 104 13 error
  • 如何在c的case语句中使用省略号?

    CASE expr no commas ELLIPSIS expr no commas 我在c的语法规则中看到了这样的规则 但是当我尝试重现它时 int test float i switch i case 1 3 printf hi 它失
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • 使用restsharp序列化对象并将其传递给WebApi而不是序列化列表

    我有一个看起来像的视图模型 public class StoreItemViewModel public Guid ItemId get set public List
  • 跨多个域的 ASP.NET 会话

    是否有合适的 NET 解决方案来在多个域上提供持久服务器会话 即 如果该网站的用户在 www site1 com 下登录 他们也将在 www site2 com 下登录 安全是我们正在开发的程序的一个问题 Thanks 它是否需要在会话中
  • 使用taskkill停止Windows服务

    我需要帮助来使用 C 终止 Windows 服务 现在要终止该服务 请使用以下选项 从命令 sc queryex ServiceName 发现后PID服务的 taskkill pid 1234 exemple f 为了便于阅读 但如果您明白

随机推荐

  • 获取 Librosa 中与 STFT 相关的频率

    使用时librosa stft 要计算频谱图 如何获取相关的频率值 我对生成图像不感兴趣 如librosa display specshow 而是我希望掌握这些价值观 y sr librosa load recordings high pi
  • Azure 媒体播放器无法在 iPhone 上使用 AES 保护

    我们在 iPhone 6 A1586 上播放受 AES 使用 JWT 令牌身份验证 保护的视频时遇到问题 欠费错误如下 0x50300000 视频播放因损坏问题而中止 或者因为视频使用了您的浏览器不支持的功能 禁用加密后 播放相同的视频不会
  • Google 脚本可跨多个工作表工作

    我是 Google 脚本的新手 所以如果这个问题已经得到解答 我深表歉意 我有一个包含多个工作表的电子表格 其中一些工作表上有一个状态列 使用我已经发现的代码 我可以根据状态列中单元格中的值设置整个行颜色 我遇到的问题是我只能让代码在一张纸
  • 有效查询合并2个以上子查询

    我有一个数据库 books primary key bookID characterNames foreign key books bookID locations foreign key books bookID 角色名称和位置的文本位置
  • 我可以在批处理文件中使用多少个变量

    我有点好奇我可以在批处理文件中设置多少个变量 我这里有一个小脚本 ECHO OFF SETLOCAL EnableDelayedExpansion FOR L P IN 1 1 2147483647 DO SET Foo P P ECHO
  • 寻求参考来理解一种模式“!_[$0]++”

    我是 AWK 新手 使用移植到 Windows UNXUtils 的 GNU 实用程序和 gawk 而不是 awk 该论坛上的解决方案的工作原理如下绝对的魔法 并且我正在尝试找到一个可以阅读的来源 以更好地理解该解决方案中提供的模式表达式
  • 从点(x,y)以给定角度在边界内绘制一条线[重复]

    这个问题在这里已经有答案了 我正在尝试在 JavaScript 画布上画一条线 我有两个点A和B 如图所示 我使用此代码来查找这两点之间的角度 p1 is point A and p2 is point B var theta Math a
  • 为什么当我使用 DriverManager.getConnection 时我的 SQL 连接会卡住?

    我的 Java 代码如下所示 并且我的机器上运行着一个 MySQL 数据库 System out println Loading JDBC Class forName com mysql jdbc Driver newInstance Sy
  • Visual Studio 诊断会话无法启动 - 运行 Visual Studio 2013 诊断需要哪些访问权限

    Visual Studio 2013 诊断会话无法启动 无法加载收集器代理 访问被拒绝 我想知道运行性能和诊断工具需要哪些访问权限 我遇到了同样的问题 对我来说 这是由于我不是我的开发人员计算机上的本地管理员 如果我在本地管理员的提升帐户下
  • Microsoft 推送通知服务定价

    我已阅读有关他们为 Windows 手机提供的推送通知服务的 Microsoft 文档 但没有有关定价的信息 我在某处读到 每天 每个应用程序 每个设备最多可以免费使用 500 个通知 并且它是未经身份验证的模式 但也有经过身份验证的模式
  • 将 HarddiskVolume 路径转换为正常路径[重复]

    这个问题在这里已经有答案了 我有这样的设备路径 设备 HarddiskVolume2 Windows 我想将其转换为像这样的正常路径 C Windows 我尝试使用 fullpath splitpath etc 但没有新结果 该功能执行哪个
  • 如何查看 nusoap 的“原始 xml”输出?

    我有一个通用函数 用于传递 SOAP 命令 我需要查看正在处理的 RAW XML 数据sent到服务器来诊断错误 我怎么做 没关系 这似乎已经非常接近了 http www scottnichol com nusoapintro htm ht
  • 我可以让 IntelliJ IDEA 看起来更像 Eclipse 吗?

    我已经在 Eclipse 中进行开发很长一段时间了 但我仔细研究了 IntelliJ IDEA 9 0 3 因为它具有良好的 Flex 开发工具和 Maven flexmojos 集成 但我就是无法忍受 Ubuntu 10 04 上的外观
  • 如何在Linux中找到处理器队列长度

    尝试确定 Linux 计算机上的处理器队列长度 准备运行但当前未运行的进程数 Windows 中有一个针对此指标的 WMI 调用 但对 Linux 不太了解 我正在尝试挖掘 proc 和 top 以获取信息 有没有办法确定CPU的队列长度
  • JavaScript setInterval 限制?

    我有一个使用 JavaScript 的应用程序setInterval 运行数字时钟 我想知道它执行此函数的次数是否有超时或限制 setInterval 将无限运行 如果您希望终止 循环 可以使用clearInterval 例如 var co
  • 红宝石案例陈述与比较[重复]

    这个问题在这里已经有答案了 有没有办法使用caseruby 中整数比较的语句 我发现了很多比较字符串的例子 但是我的case下面的示例因语法错误而失败 def get price rank price case price when lt
  • 升级到 Xcode 8.2.1 后,iOS 模拟器无法在代理后面工作?

    我正在需要身份验证的代理环境中工作 由于我已升级到 Xcode 8 2 1 模拟器停止工作 但它在 Xcode 8 1 和 7 3 上运行良好对此有任何帮助吗 这是我收到的错误 PAC 获取失败并出现错误 NSURLErrorDomain
  • 在shell脚本中打印C程序的输出

    我有一个程序 我必须使用一个 c 程序将开尔文转换为远 反之亦然 我需要输出方面的帮助 它应该从我放入 file 和用户的 choice 中的数据文件中读取 并在 c 程序文件 farh kel 中运行它 while read val do
  • 禁用某些图像的缓存

    我使用 PHP 库生成一些图像 有时浏览器不会加载新生成的文件 如何仅对我动态创建的图像禁用缓存 注意 随着时间的推移 我必须对创建的图像使用相同的名称 解决这个问题的一个常见而简单的解决方案是向每个动态图像请求添加一个随机生成的查询字符串
  • 头文件中的 const 变量和静态初始化惨败

    在阅读了很多有关静态变量初始化的问题后 我仍然不确定这如何适用于const命名空间级别的变量 我有以下代码header file config h由构建脚本生成 static const std string path1 xyz abc s