[英]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.