【问题标题】:extern variable and array declare issue c++外部变量和数组声明问题 C++
【发布时间】:2015-05-12 06:17:24
【问题描述】:

我对外部变量和数组声明有疑问。 如何使用不在可声明文件中的全局变量声明数组。

file1.cpp

const int size = 10;

ma​​infile.cpp

extern const int size;

void main()
{
  int mas[size];
}

int mas[size];

这条线有问题。 请大家猜一猜??

【问题讨论】:

  • 如果我们知道您有什么问题,那就更容易猜到了。如果您发布有关编译器错误的问题,请包括实际错误,完整且未经修改。
  • 当然,错误 C2057:预期的常量表达式错误 C2466:无法分配常量大小的数组 0 错误 C2133:'mas':未知大小

标签: c++ arrays global-variables constants extern


【解决方案1】:

你不能。数组大小必须是常量表达式;如果它是一个变量,那么该变量必须是 const 并在同一个翻译单元中初始化,以便它的值可用作常量。

如果您想在多个翻译单元之间共享值,请将其定义在标题中并将其包含在内。

【讨论】:

  • 所以我不能。谢谢!
【解决方案2】:

首先,常量有内部链接。因此这些声明

file1.cpp
const int size = 10;

和

mainfile.cpp
extern const int size;

引用不同的实体。

file1.cpp 中声明的常量在其对应的编译单元之外是不可见的。

根据 C++ 标准(3.5 程序和链接)

3 具有命名空间范围 (3.3.6) 的名称具有内部链接,如果它是 名字

— 非易失性变量,显式声明为 const 或 constexpr 并且既没有显式声明 extern 也没有以前声明 声明有外部链接;或

在 mainfile 中没有指定 size 的值,所以编译器会为 statement 发出错误

int mas[size];

因为数组的大小应该是编译时常量表达式。

最简单的解决方案是放置常量定义

const int size = 10;

在一些通用头文件中,这些头文件将包含在每个翻译单元中,其中有对常量的引用。

【讨论】:

    【解决方案3】:

    int mas[大小];

    这条线有问题。请大家猜一猜??

    正如其他用户指出的那样,问题可能是您正在尝试创建一个 Variable Lenght Array,这在 C++ 中是不允许的(但几乎在 C++14 中输入为 Dynamic Arrays*)。

    一些编译器接受 VLA 作为扩展(无标准),所以我猜您使用的是没有此扩展或禁用此扩展的编译器。

    别担心,反正你有解决办法...

    #define(不要那样做)

    假设问题是 VLA,如果我们确保 size 作为编译时值,那么问题就解决了......

    // file1.hpp <-- This is now a HEADER not a CPP
    #define SIZE 10
    
    // mainfile.cpp
    #include "file1.hpp"
    
    void main()
    {
        int mas[SIZE]; // accepted, equivalent to int mas[10].
    }
    

    常量表达式

    C++11 引入了constexpr* 关键字,可以用来实现你的目标

    // file1.hpp <-- This is now a HEADER not a CPP
    constexpr int size() { return 10; }
    
    // mainfile.cpp
    #include "file1.hpp"
    
    void main()
    {
        int mas[size()];
    }
    

    枚举

    枚举是编译时常量,所以你可以这样使用它们:

    // file1.hpp <-- This is now a HEADER not a CPP
    enum constant { size = 10 };
    
    // mainfile.cpp
    #include "file1.hpp"
    
    void main()
    {
        int mas[constant::size];
    }
    

    *如果有人找到更好的链接,请告诉我。

    【讨论】:

      【解决方案4】:

      C++ 不允许在运行时指定数组的大小。在您的示例中,它当然是在链接时指定的,但这对编译器没有帮助。 但是,如果您使用的是 C++14 编译器,并且在某些其他编译器(例如 gcc)上,您可以这样做,但它的可移植性不如动态分配内存,并且不如 std::vector 方便。

      供参考:https://isocpp.org/wiki/faq/freestore-mgmt#dynamic-array-len

      【讨论】:

      • 可变长度数组在 C++14 中不是标准的(尽管它们是被提议的,但它们没有被标准化)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      相关资源
      最近更新 更多