extern变量和数组声明问题c ++

时间:2015-05-12 06:17:25

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

我有一个外部变量和带有它的数组声明的问题。 如何使用不在可声明文件中的全局变量声明数组。

file1.cpp

const int size = 10;

mainfile.cpp

extern const int size;

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

此行存在问题。 请猜猜??

4 个答案:

答案 0 :(得分:6)

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

如果要在多个翻译单元之间共享值,请在标题中定义并包含该翻译单元。

答案 1 :(得分:3)

首先,常量有内部联系。因此这些声明

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的值,因此编译器将为语句

发出错误
int mas[size];

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

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

const int size = 10;

在一些常见的headet文件中,该文件将包含在每个翻译单元中,其中存在对常量的引用。

答案 2 :(得分:2)

  

int mas [size];

     

此行存在问题。请猜猜??

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

有些编译器接受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].
}

constexpr

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];
}

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

答案 3 :(得分:1)

C ++不允许在运行时指定数组的大小。在您的示例中,它当然是在链接时指定的,但这对编译器没有帮助。 但是,如果您正在使用C ++ 14编译器,并且在某些其他编译器(例如gcc)上可以执行此操作,但它比动态分配内存更不便携,并且比std :: vector&lt;&gt;更方便。

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