簡體   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