第8章. 教科書には載っていない重要なC構文
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
前章では、従来のC言語の教科書が強調していたが、現在のコンピューティング環境では関係ないかもしれないトピックをいくつか取り上げた。この章では、多くの教科書がカバーしていないか、あるいはほんの少ししか触れていない点を発見した。前章と同様、この章も多くの小さなトピックをカバーしているが、主に3つのセグメントに分かれている:
-
多くの人がプリプロセッサを補助的なもの、あるいは本当のC言語ではないと考えるからだろう。しかし、プリプロセッサが存在するのには理由がある。すべての標準準拠コンパイラが同じ機能を提供しているわけではないし、プリプロセッサは環境の特性を判断し対応する方法でもある。
-
C言語の教科書を調査したところ、
staticとexternキーワードに触れていない本が1、2冊発見された。そこでこの章では、リンケージについて説明し、staticキーワードの紛らわしい使い方を説明する。 -
constキーワードはこの章にふさわしく、使わない手はないほど便利なものだが、規格上の仕様や一般的なコンパイラでの実装には奇妙な点がある。
堅牢性と豊かなマクロを養う
状況によっては、ユーザが避けなければならない一般的な落とし穴があるが、その落とし穴を常に回避するマクロを提供できれば、より安全なユーザ・インタフェースを手に入れることができる。第10章では、ライブラリのユーザ・インタフェースをより親しみやすく、エラーを招きにくいものにするためのいくつかのエラーを紹介し、そのためにマクロを多用する。
マクロはそれ自体がエラーの誘因であり、避けるべきだと言う人々を多く読み取るが、そのような人々は、NULL 、is 、alpha 、isfinite 、assert 、log 、sin 、cos 、pow のような型ジェネリック数学、あるいはGNU標準ライブラリがマクロを介して定義している他の数十の機能のどれかを使うべきではないとは助言しない。これらはよく書かれた堅牢性の高いマクロであり、常に必要なことを実行してくれる。
マクロはテキストの置換(置換されるテキストが長くなることを前提に展開と呼ばれる)を行うが、テキストの置換は入力テキストがマクロ内のテキストやソースコード内の他のテキストと相互作用する可能性があるため、通常の関数とは異なる考え方が必要になる。マクロは、このような相互作用が必要な場合に使用するのが最適であり、そうでない場合は、相互作用を防ぐように注意する必要がある。
マクロを堅牢性にする規則(3つある)を説明する前に、2種類のマクロを区別しよう。ひとつは式の評価に展開されるもので、マクロを評価したり、値を出力したり、数値の場合は式の途中で使ったりする。もう1つのタイプは命令のブロックで、if 文の後やwhile ループの中に現れることがある。とはいえ、いくつかの規則がある:
-
パレンスマクロでテキストを所定の位置に貼り付けると、期待が崩れやすい。簡単な例を挙げよう:
#define double(x) 2*x Needs more parens.さて、ユーザが
double(1+1)*8を試そうとすると、マクロはそれを2*1+1*8に展開する。パーレンでうまくいく:#define double(x) (2*(x))これで
(2*(1+1))*8。一般化規則では、特別な理由がない限り、すべての入力を括弧で囲む。式型マクロがある場合は、マクロ展開自体を括弧で囲む。 ...
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