簡體   English   中英

C中返回結構的函數

[英]Function returning struct in C

我們在哪里可以編寫代碼

struct Foo
{
    int bar;
    int baz;
} foo()
{

}

C89/C90? C99? C11? 或者它可能只是 K&R?

還有這個怎么辦

void foo(bar, baz)
int bar;
int baz;
{
}

這是自 C89 以來的標准。 在 K&R C 中,無法返回結構,只能返回指向結構的指針。

從 C89 開始,返回struct是可能且有用的。

您的第二個示例foo是舊的 K&R C,在較新的標准中已棄用。

請注意,在 Linux x86-64 上, ABI定義了直接通過寄存器返回兩個成員結構的調用約定 其他結構通過內存返回,因此返回可能比單個指針慢一點。

例如,你可以定義一個點是一個struct兩個數字(例如intdouble )被稱為xy ,並返回這樣的struct ,從一些getPosition程序。 在 Linux/x86-64 上,這兩個數字將在兩個寄存器中返回(無需在內存中構建一些struct體,當啟用優化並且可能時),例如:

 struct point_st { int x, y; };

 struct point_st getPosition(void);

 struct point_st getPosition () {
   struct point_st res = {-1,-1};
   res.x = input_x();
   res.y = input_y();
   return res;
 };

您通常希望在函數原型之前聲明返回的struct

在 C89/C90 中,可以有一個返回結構體的函數。

我在標准中沒有找到任何明確的定義,但第 3.3.2.3 節“結構和工會成員”中的腳注說:

示例 1:如果f是返回結構或聯合的函數,而x是該結構或聯合的成員,則f().x是有效的后綴表達式但不是左值。

盡管如此,第 3.6.6.4 節“返回語句”並沒有丟失關於​​結構和聯合作為返回類型的內容。

第 3.5.4.3 節“函數聲明符(包括原型)”說:

函數聲明符不應指定函數類型或數組類型的返回類型。

它沒有提到對結構或聯合類型的任何限制,因為這將是此類限制所屬的地方,所以它們是被允許的。

C99 有相同的措辭,只是重新編號了部分。

暫無
暫無

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

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