簡體   English   中英

是否可以在C / C ++中聲明全局2D數組?

[英]Is it possible to declare a global 2D array in C/C++?

當我嘗試在C++聲明一個global二維數組時 ,如下所示:

int maxX = 10;
int maxZ = 10;
SDL_Rect mapX[maxX][maxZ];

我得到一個錯誤說
error: variable-size type declared outside of any function

(乍一看,它看起來像是“C和C ++問題之間的區別”。雖然我可能會弄錯。)

由於您使用非常量值作為數組大小,因此您嘗試聲明可變長度數組(VLA)。 C ++根本不支持VLA,而C僅支持本地 VLA。 后者正是編譯器在該錯誤消息中告訴您的內容。 (我相信這個錯誤消息來自C編譯器,因為C ++編譯器會給你一個完全不同的錯誤。)

因此,嚴格地說,您無法在C或C ++中聲明此類數組。 雖然C語言支持VLA,但它們仍然必須是本地的。 您不能在C中聲明具有靜態存儲持續時間的VLA。

在C ++中,所有數組都必須具有固定的預定編譯時大小。 這意味着數組大小必須由編譯時常量指定。 您使用非常量值,這是導致錯誤的原因。

換句話說,在C和C ++中,在為具有靜態存儲持續時間的數組(包括所謂的“全局”數組)指定大小時,需要使用常量表達式。

在C ++中為了使你的大小保持不變,你必須用const聲明它們

const int maxX = 10;
const int maxZ = 10;

在C中,這將不起作用,因為在C const對象在某種意義上並不是真正的常量,它們不會形成常量表達式 在C中你必須使用其中之一

#define maxX 10
#define maxZ 10

要么

enum {
  maxX = 10,
  maxZ = 10
};

在C ++中,您不能使用變量來定義數組的大小,因為編譯器需要在編譯時知道在何處分配數組的內存以及需要多少內存。 maxXmaxZ聲明為int會使它們成為變量,因此不適合數組維度。 但是,如果將它們聲明為const int ,則它們將成為內容,編譯器將知道這些值將在程序執行時得到修復,並允許它們用於定義數組維度。

因此,這不起作用:

int maxX = 10;
int maxZ = 10;
SDL_Rect mapX[maxX][maxZ]; // Not allowed

但這很好:

const int maxX = 10;
const int maxZ = 10;
SDL_Rect mapX[maxX][maxZ]; // Allowed
static const int maxX = 10;
static const int maxZ = 10;
SDL_Rect mapX[maxX][maxZ];

對我來說很好。


注意

一般來說,使用全局變量或原始數組或全局原始數組通常不是好的做法。 顯然,我沒有足夠的背景來評論它是否是正確的選擇。


歷史記錄

在現代constness之前,通常枚舉或#define常量使它們在這種情況下正常工作。

我不這么認為這是使用SDL_rect的正確方法。

語法應該是這樣的

SDL_Rect rect = {0,0,10,10}

所以你可以做到以下幾點;

int maxX = 10;
int maxZ = 10;
SDL_Rect rect = {0,0,maxX,maxZ}

而不是C風格的數組,我建議使用std::vector

std::vector< std::vector<SDL_Rect> > mapX;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM