![](/img/trans.png)
[英]Difference between passing an array as formal parameter as int arr[] and int arr[N] in C/C++
[英]Is int arr[ ] valid C++?
我想了解是否寫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++。 所以我想知道這在什么情況下有效/無效。 為此,我編寫了上面的代碼片段並想通過這個例子來理解。
讓我們看看每個案例。
這里我們有聲明
int a[]; //this is a definition so size must be known
這是無效的。
在這里,我們有聲明:
extern int b[];//this is a declaration that is not a definition
這是有效的。 這里b
的類型是不完整的。 此外, b
具有外部鏈接。
在這里,我們有:
int (*ptrB)[];
這是有效的。 我們說ptrB
是一個指向不完整類型的指針。
在這里,我們有:
struct Name
{
int k[]; //NOT VALID
};
這從cppreference無效:
以下任何上下文都要求類型 T 是完整的:
- 聲明 T 類型的非靜態 class 數據成員;
在這里,我們有:
void func()
{
ptrB++; //NOT VALID
}
這在后綴增量的文檔中是無效的:
內置后綴遞增或遞減運算符的操作數 expr 必須是非布爾(C++17 起)算術類型的可修改(非常量)左值或指向完全定義的object 類型的指針。
在這里,我們有:
void bar()
{
ptrB = &b;//NOT VALID
}
這從cppreference無效:
數組 object 的聲明類型可能是一個未知邊界數組,因此在翻譯單元中的某個點不完整,稍后完成; 這兩個點的數組類型(“T 的未知邊界數組”和“NT 數組”)是不同的類型。
在這里,我們有:
void bar()
{
ptrB++; //NOT VALID
這從cppreferene無效:
指向未知邊界數組的指針的類型,或指向由 typedef 聲明定義為未知邊界數組的類型的指針的類型無法完成。
所以我們會得到與案例 5 相同的錯誤。
在這里,我們有:
int main()
{
int c[];
}
這是無效的,因為這是一個定義,因此必須知道大小。
在這里,我們有:
int main()
{
extern int d[]; non-defining declaration
}
這是有效的。 d
有外部聯系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.