第10章. より良い構造
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
29種類の属性があり、気に入ったのは7種類だけだ。
ザ・ストロークス、"You Only Live Once"
この章では、構造化された入力を受け取る関数と、ライブラリのユーザ・インタフェースの改良について説明する。
この章ではまず、ISO C99規格でCに導入された3つの構文、すなわち複合リテラル、可変長マクロ、指定初期化子を取り上げる。この章では、これらの要素の組み合わせによってできることのすべてを探求している。
複合リテラルを使えば、より簡単にリストを関数に送ることができる。そして、可変長マクロを使えば、ユーザから複合リテラルの構文を隠すことができ、任意の長さのリストを受け取ることができる関数を残すことができる。f(1, 2) やf(1, 2, 3, 4) も同様に有効である。
他の多くの言語で見られるように、foreach キーワードを実装したり、1入力の関数をベクトル化して複数の入力で演算するようにするために、同様の形式を使用することができる。
指定初期化によって、構造体の扱いが非常に簡単になり、私は以前の方法をほとんど使わなくなった点である。person_struct p = {"Joe", 22, 75, 20} のような読みにくくてエラーになりやすいゴミの代わりに、 person_struct p = {.name="Joe", .age=22, .weight_kg=75, .education_years=20} のような自己文書化された宣言を書くことができる。
構造体を初期化することが苦にならないようになった今、関数から構造体を返すことも苦にならず、関数インタフェースを明確にするために大いに役立つ。
構造体を関数に送ることも、より現実的な選択肢になる。すべてを別の可変長マクロでラップすることで、関数のユーザが指定しない関数の引数にデフォルト値を割り当てることもできる。ローン計算機の例では、amortization(.amount=200000, .rate=4.5, .years=30) とamortization(.rate=4.5, .amount=200000) の両方が有効な関数である。2番目の呼び出しではローン期間が指定されていないため、関数はデフォルトの30年ローンを使用する。
残りの章では、ボイドポインタに基づく関数インタフェースを扱う場合や、ひどいインタフェースを持つレガシーコードをユーザビリティのあるものにラップする必要がある場合など、入出力構造体を使うことで生活が楽になる状況の例をいくつか紹介する。
複合リテラル
double a_value という宣言があれば、Cは を理解するのに問題はない。f(a_value)
しかし、要素のリスト({20.38, a_value, 9.8}のような複合リテラル値)を送りたい場合は、構文上の注意点がある。複合リテラルの前にタイプキャストを置かないと、パーサが混乱してしまう。リストは(double[]) {20.38, a_value, 9.8} のようになり、呼び出しは次のようになる:
f((double[]) {20.38, a_value, 9.8});
つまり、malloc もfree も必要ない。複合リテラルが現れるスコープの最後では、それはただ消えるだけである。
例10-1は、double ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access