外部变量和数组声明问题C

extern variable and array declare issue c++

本文关键字:问题 声明 数组 变量 外部      更新时间:2023-10-16

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

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