在 C++ 中创建全局“常量”的正确方法[重复]

2024-02-08

通常,我定义真正的全局常量(比如说 pi)的方法是将 extern const 放置在头文件中,并在 .cpp 文件中定义该常量:

常量.h:

extern const pi;

常量.cpp:

#include "constants.h"
#include <cmath>
const pi=std::acos(-1.0);

这对于 pi 等真实常量非常有效。但是,我正在寻找定义“常量”的最佳实践,因为它将在程序运行到程序运行之间保持不变,但可能会根据输入文件而变化。重力常数就是一个例子,它取决于所使用的单位。 g 在输入文件中定义,我希望它是任何对象都可以使用的全局值。我一直听说拥有非常量全局变量是不好的做法,所以目前我将 g 存储在系统对象中,然后将其传递给它生成的所有对象。然而,随着对象数量的增加,这似乎有点笨重且难以维护。

想法?


这完全取决于您的应用程序大小。如果您确实绝对确定某个特定常量将具有由代码中的所有线程和分支在一次运行中共享的单个值,并且将来不太可能改变,那么全局变量最接近地匹配预期语义,所以最好只使用它。如果需要的话,稍后重构也是微不足道的,特别是当您为全局变量使用独特的前缀时(例如g_)这样他们就不会与当地人发生冲突——总的来说,这是一个好主意。

总的来说,我更喜欢坚持 YAGNI,而不是试图盲目地安抚各种编码风格指南。相反,我首先查看他们的基本原理是否适用于特定情况(如果编码风格指南没有基本原理,那么它就是一个糟糕的指南),如果显然不适用,那么就没有理由应用该指南对于那种情况。

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

在 C++ 中创建全局“常量”的正确方法[重复] 的相关文章

随机推荐

  • Delphi XE - TRibbon 操作始终将焦点发送到 MainForm

    当我将 TRibbon 控件放置在不是应用程序 MainForm 的窗体上时 TRibbon 的操作 即剪切 粘贴 将始终在执行操作后将焦点返回到 MainForm 即使保存 TRibbon 的 TForm 不是 MainForm 的子级
  • “less”命令显示输出所花费的时间

    我有一个可以产生大量输出的脚本 脚本在该点暂停几秒钟T 现在我正在使用less命令来分析脚本的输出 所以我执行 script less 我让它运行足够的时间 以便脚本完成执行 现在 我按 Pg Down 键查看 less 命令的输出 令人惊
  • 使用 pythonpyral 将标签添加到 Rally 缺陷

    我正在尝试使用pyral python 包创建Rally 缺陷 需要添加标签 TestTag2 有没有办法在创建缺陷时添加标签 我正在尝试在创建缺陷后添加标签 但出现以下错误 info Workspace workspace 123 Pro
  • 如何在 ASP.NET Core 中获取 HttpContext.Current.Session?

    我需要将 MVC 项目迁移到 net Core 我知道它已从 ASP net Core 中删除了 System Web 我需要转换 HttpContext Current Session 名称 在 ASP NET Core 中为 Null
  • 访问 Firefox 中的文件下载对话框

    是否有任何类型的 API 可以让我在 Firefox 中操作文件下载对话框 我想访问用户执行某些操作时出现的内容 而不是自己启动的内容 我想做的是从 Selenium 访问这个对话框 我也不确定 Selenium 特权模式 是否足以访问 c
  • MSB3411 无法加载 Visual C++ 组件

    我有 MS Visual Studio 2012 Ultimate 操作系统是 Windows 7 并且安装了 nodeJs 我想使用 npm 安装 socket io 但出现以下错误 C Users NEW gt npm install
  • 哪些标准 C++ 类不能在 C++ 中重新实现?

    我正在查看 C 0x 的计划并发现std initializer list用于在用户类中实现初始值设定项列表 此类无法在 C 中实现 不使用自身 或者使用一些 编译器魔法 如果可以的话 就不需要它了 因为无论您使用什么技术来实现initia
  • 如何屏蔽图片的 Facebook 图形 api URL?

    我正在尝试在我的网站上显示 Facebook 个人资料图片 但不想泄露源中人员的 Facebook ID 例如 这个网址 http graph facebook com 4 picture http graph facebook com 4
  • 具有 MySQL 故障转移功能的 Hibernate Web 应用程序

    我开发了一个 Java Web 应用程序 使用 Hibernate 3 3 2 作为持久性框架 使用 Apache Tomcat 7 0 27 作为服务器 该应用程序已成功设置为使用 MySQL 5 5 复制服务器 1 个主服务器 1 个从
  • 如何将 vtkSphere 保存到 VTK 文件?

    我正在尝试将多个球体保存到一个文件中 以便稍后使用 ParaView 进行可视化 我拥有的是一个文本文件 其中包含有关每个球体的位置和形状 半径 的信息 我正在使用 Python 和 VTK 构建一个文件来可视化 ParaView 中的数据
  • 使用 OR 工具在 python 中进行约束优化:如何强制执行多级约束?

    我有一个优化问题 我有一个 BoolVar 对象列表的列表 所以像这样 BoolVar1 BoolVar2 BoolVar3 BoolVar4 BoolVar5 BoolVar6 我需要评估以下内容 BoolVar1 BoolVar2 Bo
  • 关于 C# 的 AOP 的建议 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 MySQL DB 完成 Java 桌面应用程序后如何创建安装程序?

    我已经用 mySQL 数据库编写了一个 Java 桌面应用程序 我想让应用程序在netbeans之外运行并让它安装在其他计算机上 我知道如何构建项目并创建可运行的 jar 文件 但这需要我将数据库本身导出到我希望应用程序运行的另一台计算机
  • apache 全局基本身份验证

    我有 apache Web 服务器和几个虚拟主机 我希望它们都支持基本授权 AuthType Basic 但是 Auth 指令似乎仅适用于
  • NSURLSession 使用 get 发送参数

    我正在尝试解析来自 php 的信息 但我需要发送一个字典参数 所以我尝试了一些事情 我看到了教程 示例 但我陷入困境 所以我回到了开始 这是什么好方法这样做吗 func asd let urlPath http xxxxx php let
  • 为什么 Spyder 在 OS X 中这么慢?有没有办法让它更快?

    我安装了 Spyder 作为 Anaconda Python 分析包的一部分 但我发现编辑器非常慢 按键和屏幕上显示字母之间总是有半秒的延迟时间 我在一台相当新的 i7 MacBook 上使用 Spyder 这个问题是由 Qt 产生的 Qt
  • 监听/通知 pgconnection 宕机了 java?

    我正在使用 PostgreSQL DB 并应用它LISTEN NOTIFY功能 所以我的监听器位于我的 AS 应用程序服务器 上 并且我在数据库上配置了触发器 这样当对表执行 CRUD 操作时NOTIFY请求在 AS 上发送 LISTENE
  • python 类继承树

    假设我有这样的课程 class a object pass class b a pass class c b pass class d c pass class e b pass 我想要一个可以执行以下操作的函数 gt gt gt get
  • 哈希表和子串匹配

    我有数百个键 例如 红苹果 maninred foraman 蓝苹果 我有与这些键相关的数据 数据是一个字符串 末尾有相关的键 红苹果 树上有红苹果 maninred 她看到了maninred 孔洞 他们买了现在的孔洞 蓝苹果 令人惊讶 但
  • 在 C++ 中创建全局“常量”的正确方法[重复]

    这个问题在这里已经有答案了 通常 我定义真正的全局常量 比如说 pi 的方法是将 extern const 放置在头文件中 并在 cpp 文件中定义该常量 常量 h extern const pi 常量 cpp include consta