[英]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作为扩展(没有标准)所以我猜你正在使用没有此扩展或禁用此扩展的那个。
不用担心,无论如何你都有工作...
假设问题是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];
}
*如果有人找到了更好的链接,请告诉我。
C ++不允许在运行时指定数组的大小。 在您的示例中,它当然是在链接时指定的,但这对编译器没有帮助。 但是,如果您正在使用C ++ 14编译器,并且在某些其他编译器(例如gcc)上可以执行此操作,但它比动态分配内存更不便携,并且比std :: vector <>更方便。
供参考: https : //isocpp.org/wiki/faq/freestore-mgmt#dynamic-array-len
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.