我試圖了解寫作int arr[];在 C 中是否有效。所以舉個例子,
int a[]; //is this valid?
extern int b[];//is this valid?
int (*ptrB)[]; //is this valid?
struct Name
{
int k[]; //is this valid?
};
void func()
{
ptrB ; //is this valid?
}
int a[10];
int b[10];
void bar()
{
ptrB = &b;//is this valid?
ptrB ; //is this valid?
}
int main()
{
int c[];//is this valid?
extern int d[]; //is this valid?
}
int c[10];
int d[10];
我已經閱讀了一些關于 SO 的評論,指出這int p[];不是有效的 C 。所以我想知道這在什么情況下有效/無效。為此,我撰寫了上面的代碼片段并想通過這個例子來理解。
uj5u.com熱心網友回復:
讓我們看看每個案例。
情況1
這里我們有宣告
int a[]; //this is a definition so size must be known
這是無效的。
案例2
在這里,我們有宣告:
extern int b[];//this is a declaration that is not a definition
這是有效的。這里的型別b是不完整的。此外,b具有外部聯系。
案例3
在這里,我們有:
int (*ptrB)[];
這是有效的。我們說那ptrB是一個指向不完整型別的指標。
案例4
在這里,我們有:
struct Name
{
int k[]; //NOT VALID
};
這從cppreference無效:
以下任何背景關系都要求型別 T 是完整的:
- 宣告型別為 T的非靜態類資料成員;
案例5
在這里,我們有:
void func()
{
ptrB ; //NOT VALID
}
這在后綴增量的檔案中是無效的:
內置后綴遞增或遞減運算子的運算元 expr 必須是非布爾(C 17 起)算術型別的可修改(非常量)左值或指向完全定義物件型別的指標。
案例6
在這里,我們有:
void bar()
{
ptrB = &b;//NOT VALID
}
這從cppreference無效:
陣列物件的宣告型別可能是一個未知邊界的陣列,因此在翻譯單元中的某個時間點是不完整的,稍后會完成;這兩個點的陣列型別(“T 的未知邊界陣列”和“N T 的陣列”)是不同的型別。
案例7
在這里,我們有:
void bar()
{
ptrB ; //NOT VALID
這從cppreferene無效:
指向未知邊界陣列的指標的型別,或指向由 typedef 宣告定義為未知邊界陣列的型別的指標的型別無法完成。
所以我們會得到與案例 5 相同的錯誤。
案例8
在這里,我們有:
int main()
{
int c[];
}
這是無效的,因為這是一個定義,因此必須知道大小。
案例 9
在這里,我們有:
int main()
{
extern int d[]; non-defining declaration
}
這是有效的。d有外部聯系。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/405959.html
標籤:
