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