簡體   English   中英

int arr[ ] 是否有效 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++。 所以我想知道這在什么情況下有效/無效。 為此,我編寫了上面的代碼片段並想通過這個例子來理解。

讓我們看看每個案例。

情況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 類型的非靜態 class 數據成員

案例5

在這里,我們有:

void func()
{
    ptrB++; //NOT VALID
}

這在后綴增量的文檔中是無效的:

內置后綴遞增或遞減運算符的操作數 expr 必須是非布爾(C++17 起)算術類型的可修改(非常量)左值或指向完全定義的object 類型的指針。

案例6

在這里,我們有:

void bar()
{
    ptrB = &b;//NOT VALID
}

這從cppreference無效

數組 object 的聲明類型可能是一個未知邊界數組,因此在翻譯單元中的某個點不完整,稍后完成; 這兩個點的數組類型(“T 的未知邊界數組”和“NT 數組”)是不同的類型

案例7

在這里,我們有:

void bar()
{
    ptrB++; //NOT VALID

這從cppreferene無效

指向未知邊界數組的指針的類型,或指向由 typedef 聲明定義為未知邊界數組的類型的指針的類型無法完成

所以我們會得到與案例 5 相同的錯誤。

案例8

在這里,我們有:

int main()
{
    int c[]; 
}

這是無效的,因為這是一個定義,因此必須知道大小。

案例 9

在這里,我們有:

int main()
{
    extern int d[]; non-defining declaration
}

這是有效的。 d外部聯系

暫無
暫無

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

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