繁体   English   中英

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

[英]extern variable and array declare issue c++

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

file1.cpp

const int size = 10;

mainfile.cpp

extern const int size;

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

int mas[size];

这条线有一个问题。 请猜猜想?

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

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

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

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文件中,将包含在每个翻译单元中,其中存在对常量的引用。

int mas [size];

这条线有一个问题。 请猜猜想?

正如其他用户指出的那样,问题可能是您正在尝试创建一个可变长度数组 ,这是C ++中不允许的(但几乎以动态数组 *的形式输入C ++ 14)。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM