どこに次のようなコードを書くことができますか
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
。
2番目の例foo
は古いK&R Cであり、新しい標準では非推奨になっています。
Linux x86-64では、ABIが、レジスタを介して直接2つのメンバー構造を返す呼び出し規約を定義していることに注意してください。他の構造体はメモリを介して返されるため、単一のポインタよりも返されるのが少し遅い場合があります。
たとえば、ポイントを、呼び出された2つの数値(または)のaとして定義し、あるstruct
ルーチンint
からdouble
そのようなaを返すことができます。Linux / x86-64では、2つの数値が2つのレジスタに返されます(最適化が有効で可能である場合、メモリ内にいくらか構築する必要はありません)。例:x
y
struct
getPosition
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「returnステートメント」は、戻り型としての構造体と共用体についての言葉を失うことはありません。
セクション3.5.4.3「関数宣言子(プロトタイプを含む)」は次のように述べています。
関数宣言子は、関数型または配列型である戻り型を指定してはなりません。
構造体や共用体の種類に関する制限については触れられておらず、このような制限が適用される場所であるため、許可されています。
C99も同じ表現で、セクションの番号を付け直しただけです。