我想問一下C中的轉發聲明。 例如,如果在一個文件中我宣佈C中的轉發聲明
struct task_struct;
和定義在其他文件中的結構將它的工作?因爲據我所知編譯器必須知道正在聲明的變量的大小。如果它確實如此,那麼編譯器如何處理這種類型的請求?
我在Linux源代碼中找到了上面的例子,這讓我感興趣。
我想問一下C中的轉發聲明。 例如,如果在一個文件中我宣佈C中的轉發聲明
struct task_struct;
和定義在其他文件中的結構將它的工作?因爲據我所知編譯器必須知道正在聲明的變量的大小。如果它確實如此,那麼編譯器如何處理這種類型的請求?
我在Linux源代碼中找到了上面的例子,這讓我感興趣。
一旦你使用正報關,型成爲不完全型編譯器。
編譯器不知道類型的大小或佈局,因此不能執行任何需要編譯器才能知道這些操作的操作。
在C中,如果您轉發聲明類型,則只能使用指向該類型的指針。由於指向所有結構類型的指針需要相同的大小[Note],編譯器只是高興地知道它有一個指向類型的指針。
如果我轉發聲明一個結構並定義它,其他文件會起作用嗎?
只要您只使用指向結構的指針來指示結構在文件中的結構。如果取消引用指針,將會出現錯誤,因爲編譯器不知道「未完成」類型的佈局。
[注]由於墨爾波墨涅&丹尼爾此澄清。
「工作」是什麼意思?無論哪種方式,它會以自己的方式工作。
在結構類型的完整聲明不可見的地方,它是不完整的類型,只能用作不完整類型。
在結構類型的完整聲明可見的地方,它變成了一個完整的類型,並且可以用作完整類型。
就是這樣。
與完整結構類型相比,不完整結構類型的可用性顯着降低。基本上,你只能聲明指向這些類型的指針並傳遞它們。其他任何東西(如聲明該類型的對象)都需要完整的聲明。 「
我的工作主要意思是我可以使用它而不會發生編譯時錯誤,因爲我不知道這可以完成。 –
」指向所有類型的指針需要相同的大小「 - 這是錯誤的。不同的指針類型可以有不同的大小。但是,所有* struct *指針都保證具有相同的大小。 – melpomene
@melpomene:Q被標記爲C而不是C++? –
我知道。你想說什麼? – melpomene