我有一个外部变量和数组声明的问题。如何在不在声明的文件中声明具有全局变量的数组。
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 既不明确声明为外部也不以前 宣布具有外部联系;或
在Mainfile中未指定大小的值,因此编译器将向语句
发布错误int mas[size];
因为阵列的大小应为编译时常数表达式。
最简单的解决方案是放置常数定义
const int size = 10;
在每个翻译单元中都包含在一个常数中的常见镶嵌文件中。
int mas [size];
这条线有一个问题。请任何猜测??
正如其他用户所指出的那样,问题可能是您正在尝试创建一个可变的lenght数组,这是C 中不允许的东西(但几乎在C 14中以动态数组*输入。)。
有些编译器接受VLA作为扩展名(没有标准),所以我猜您正在使用没有此扩展名或禁用此扩展名的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&lt;>。
参考:https://isocpp.org/wiki/faq/freestore-mgmt#dynamic-array-len