为什么我不能使用外部常量定义数组? 我不太理解C++中使用Extn和const关键字的概念。

为什么我不能使用外部常量定义数组? 我不太理解C++中使用Extn和const关键字的概念。,c++,arrays,constants,extern,C++,Arrays,Constants,Extern,我已经阅读了一些关于这个主题的相关问题,见下文,但到目前为止,我还没有掌握如何将它们结合起来使用 相关问题: 好的,以下面的程序代码为例: dConst.hpp 外部常量int NUM_生成器;//发电厂的发电机数量 外部常量int generatorID[NUM_GENERATORS];//发电机ID号 外部常量布尔生成器状态[NUM_生成器];//发电机状态 vConst.cpp const int NUM_生成器=4;//发电厂发电机 const int generatorID[NUM_

我已经阅读了一些关于这个主题的相关问题,见下文,但到目前为止,我还没有掌握如何将它们结合起来使用

相关问题:

好的,以下面的程序代码为例:

dConst.hpp

外部常量int NUM_生成器;//发电厂的发电机数量 外部常量int generatorID[NUM_GENERATORS];//发电机ID号 外部常量布尔生成器状态[NUM_生成器];//发电机状态 vConst.cpp

const int NUM_生成器=4;//发电厂发电机 const int generatorID[NUM_GENERATORS]=//生成器ID号 { 23, 57, 49, 106 }; const bool GENERATORS status[NUM_GENERATORS]=//生产状态在线? { 真,假,假,真 }; main.cpp

包括 包括dConst.hpp 使用std::cout; 使用std::cin; 使用std::endl; //--=====-- int main { 对于int iGenerator=0;iGeneratorcout链接器可以找到它,但编译器找不到,因为它位于不同的编译单元中。编译器需要在编译时知道数组的大小,但只有在链接时将常量声明为extern时才知道数组的大小。

链接器可以找到它,但编译器找不到,因为它位于不同的编译单元中iler需要在编译时知道数组的大小,但只有在链接时,如果常量被声明为extern,它才会被知道。

Pollex先生是完全正确的,但是我想我可以扩展他的答案,以便将来寻找此信息的人可能会有一个更完整的图景。现代IDE通常会掩盖多重性将源代码转换为可执行二进制代码所涉及的部分

广义地说,C/C++编译器只处理文本文件源文件。编译器读取这些文件,解析它们并输出目标文件。目标文件包含二进制可执行部分和符号部分。然后链接器运行,将各种二进制目标文件“链接”到单个可执行文件中。它通过匹配符号requ用可用的符号表示


在您演示的情况下,您正在使用“extern”关键字告知编译器,已定义符号的值是在与此源生成的对象不同的对象中定义的。这会告知编译器生成导入此符号的对象。然后,链接器负责将导入/导出的符号与m对象。因此,当编译器运行时,您要查找的值不可用,因为它依赖于来自另一个对象的外部符号,而该对象当时可能尚未生成。编译器无法知道符号的值,因此无法使用它。

Pollex先生完全正确,但我我想我可以扩展一下他的答案,这样将来寻找这些信息的人可能会有一个更完整的图景。现代IDE通常会掩盖将源代码转换为可执行二进制代码所涉及的多个部分

广义地说,C/C++编译器只处理文本文件源文件。编译器读取这些文件,解析它们并输出目标文件。目标文件包含二进制可执行部分和符号部分。然后链接器运行,将各种二进制目标文件“链接”到单个可执行文件中。它通过匹配符号requ用可用的符号表示


在您演示的情况下,您正在使用“extern”关键字告知编译器,已定义符号的值是在与此源生成的对象不同的对象中定义的。这会告知编译器生成导入此符号的对象。然后,链接器负责将导入/导出的符号与m对象。因此,当编译器运行时,您要查找的值不可用,因为它依赖于另一个对象的外部符号,而该对象当时可能还没有生成。编译器无法知道符号的值,因此无法使用它。

因此我需要包含声明n将vConst.cpp中的那些常量添加到main.cpp中。但是,如果我必须在另一个源文件(如powerPlant.cpp)中使用这些相同的常量,我会不会最终重新声明这些常量?因此我需要将vConst.cpp中这些常量的声明添加到main.cpp中。如果我必须在另一个源文件中使用这些相同的常量但是,我不是要重新声明这些常量吗?