[英]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
兩個數字(例如int
或double
)被稱為x
和y
,並返回這樣的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.