簡體   English   中英

將T的數組存儲在結構T中時,類型錯誤

[英]Incomplete type error when store an array of T in the struct T

為什么允許這樣做:

// 1
struct S {
    std::vector<S> v;
};

// 2
struct T {
    T* ptr;
};

這不是:

// 3
struct X {
    X arr[];
};

這是第三個示例( clang-1001.0.46.3編譯器)的錯誤:

sample.cpp:9:4: error: field has incomplete type 'X'
        X arr[];
          ^
sample.cpp:8:8: note: definition of 'X' is not complete until the closing '}'
struct X {
       ^

我理解為什么結構中不允許使用固定大小的數組的原因,這是因為sizeof(T) = sizeof(T)*array_size + size_of_other_members ,順便說一句,它可以使用std::vector<T>正常編譯,但不能編譯與T[]

對於要定義的變量,編譯器需要知道變量的大小。

在第一種情況下,您擁有的是指向S指針(請記住std::vector動態分配堆的內存,因此只需要一個指針),這是可以的,因為編譯器知道指針的大小。

在第二種情況下,當您使用X ,類型(結構)尚未完全定義,因此編譯器尚不知道X的大小。 此外,在C ++中,不能有“空”數組,所有數組都必須具有編譯時固定大小。

它被稱為Flexible array member ,它是用C編程語言的c99標准引入的。
因此在C中可能

struct IntContainer
{
  size_t length;
  int arr[];
};

但是C++沒有靈活的數組成員。
有關更多信息,請參見以下靈活數組成員-Wikipedia

暫無
暫無

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

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