簡體   English   中英

為什么我不能使用常量 int 聲明一個數組並在 C 中對其進行初始化?

[英]Why can't I use a constant int to declare an array AND initialize it in C?

選項 1:使用#define

#define kSize 5
int arr1[kSize] = {1,2,3,4,5};

--> 好的。

選項 2:使用enum

enum { eSize = 5 };
int arr2[eSize] = {1,2,3,4,5};

--> 好的。

但是,不能使用const int

const int cSize=5;
int arr3[cSize] = {1,2,3,4,5};

--> 失敗。

為什么?

具有const限定符的變量不符合integer 常量表達式的條件。 這使數組成為無法初始化的可變長度數組(VLA)。

C 標准的第 6.7.6.2p4 節描述了數組聲明符狀態:

如果大小不存在,則數組類型是不完整的類型。 如果大小是*而不是表達式,則數組類型是未指定大小的變長數組類型,它只能用於聲明或類型名稱中,function 原型 scope 這樣的 ZA3CBC3F9D0CE2F2C1554E1B671 類型仍然是完整的。 如果大小是 integer 常量表達式並且元素類型具有已知的常量大小,則數組類型不是變長數組類型; 否則,數組類型是可變長度數組類型。 (可變長度 arrays 是實現不需要支持的條件特性;參見 6.10.8.3。)

因此,如果數組不是可變長度數組,它的大小必須是 integer 常量表達式。 這在第 6.6p6 節中定義:

An integer constant expression shall have integer type and shall only have operands that are integer constants, enumeration constants, character constants, sizeof expressions whose results are integer constants, _Alignof expressions, and floating constants that are the immediate operands of casts. integer 常量表達式中的強制轉換運算符只能將算術類型轉換為 integer 類型,除非作為sizeof_Alignof .operator 的操作數的一部分

#define定義在編譯階段之前被預處理器替換,因此在第一種情況下kSize與常量5完全相同 上面的段落還指出,枚舉常量符合 integer 常量表達式,因此這使您的第二種情況正常。 第三種情況使用const限定的變量,該變量包含在 integer 常量表達式的定義中,因此這使其成為可變長度數組。

然后第 6.7.9p3 節規定了可以初始化的內容:

要初始化的實體的類型應該是一個未知大小的數組或一個完整的 object 類型而不是可變長度數組類型

如上所述,無法初始化 VLA。

暫無
暫無

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

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