在运行时定义的 C++ 全局 extern 常量可跨多个源文件使用

标签 c++ c global-variables extern

我有一个要在运行时定义的整数常量。此常量需要在全局范围内和跨多个源文件可用。我目前有以下简化情况:

  • ClassA.h 声明 extern const int someConstant;
  • ClassA.cpp 用途 someConstant在某一点。
  • Constants.h 声明 extern const int someConstant;
  • main.cpp 包括 ClassA.h Constants.h , 声明 const int someConstant ,以及在 main() 期间的某个时刻尝试初始化 someConstant到运行时的实际值。

  • 这与 char * 完美配合我用来让程序的名称在所有文件中全局可用的常量,它的声明和定义与我在这里尝试声明和定义的完全一样,但我无法让它与 int 一起使用.

    我先收到一个 error: uninitialized const ‘someConstant’ [-fpermissive]我在 main.cpp 中声明它,后来我得到一个 error: assignment of read-only variable ‘someConstant’我认为这是因为 someConstant正在开始默认初始化。

    有没有办法做我想要在这里实现的目标?提前致谢!

    编辑 (根据来自 @WhozCraig 的请求):相信我:它是不变的。我不发布 MCVE 的原因有以下三个原因:这是一项作业,来源是西类牙语,并且因为我真的想尽可能地保持问题的普遍性(和可重用性)。我开始写这个例子,中途它让我觉得不是最清楚的问题。我再试着解释一下。

    我被要求构建一个程序,该程序创建一个进程,该进程依次产生两个子项(这些子项又将分别产生两个子项,依此类推)。该程序将必须产生的代数作为单个参数。本质上创建了一种二叉树的进程。每个进程都必须提供有关他自己、他的父进程、与原始进程的关系以及他的子进程(如果有)的信息。

    所以,在上面的例子中, ClassA 实际上是一个包含有关进程信息的类(PID、PPID、子进程的 PID、与原始进程的关系程度等)。每个fork我创建了这个类的一个新实例,所以我可以“保存”这个信息并将它打印在屏幕上。

    当我定义与原始进程的关系时,有一点需要知道调用程序时使用的参数,以检查此进程是否没有子进程(以更改该特定进程的输出)。这是我需要的常量 main :生成的代数,树的“深度”。

    编辑 2 : 我必须道歉,这是漫长的一天,我没有想清楚。我将源代码从 C 切换到 C++ 只是为了使用一些面向对象的功能,完全忘记了 内部 OO 范式。我刚刚在解释这个时意识到我可能会在我的类中使用一个静态/类变量来解决这个问题(用原始进程初始化),它可能不是常量(尽管在语义上是这样)但它应该可以工作,对吧?此外,我还意识到我可以用一些不可能的 PID 值初始化上一代的 child ,并用它来检查它是否是上一代。

    对不起,感谢您的帮助:似乎这个问题是有效的,但一直是错误的问题。新口头禅:离开电脑,放松一下。

    但只是回顾一下并保持重点,绝对不可能创建一个在 C++ 中在运行时定义的全局常量,例如 @Jerry101 说?

    最佳答案

    在 C/C++ 中,常量是在编译时定义的。它不能在运行时设置。

    您可以设置 const char *xyz; 的原因在运行时,这声明了一个指向 const 字符的非常量指针。语言难听。

    所以如果你想要一个可以在 main() 中确定并且之后不会改变的 int,你可以写一个 getter int xyz()返回一个在 main() 或 getter 中初始化的静态值。

    (顺便说一句,在多个头文件中声明相同的 extern 变量不是一个好主意。)

    关于在运行时定义的 C++ 全局 extern 常量可跨多个源文件使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26072216/

    相关文章:

    c - 使用 ASCII 字符和进行二进制搜索字符串?

    c - 指向二维数组的指针

    JavaScript - 如何从 eval 脚本中隐藏全局范围

    c++ - C++中 protected 访问中的数据损坏

    c++ - 使用#ifdef 时的多个定义

    使用数组进行 C 编程

    c++ - C++ 中的全局变量

    compiler-construction - 单一静态赋值形式的全局变量

    c++ - clang 编译的模块 pcm 文件有什么用?

    c++ - 一起使用 boost::bind、boost::shared_ptr 和 boost::thread 时不调用复制构造函数