C プログラム設計を学習するためのリソース

この投稿には、古典的な C/Unix 作品のほとんどを含む UNIX 書籍のリストがあります。 Windows での C プログラミングについては、Petzold の Programming Windows がおそらく最良の出発点です。

C プログラムの設計については、一部の UNIX プログラミングの本でスニペットが説明されていますが、「C プログラム アーキテクチャ」の本については知りません。

Java に慣れている場合は、C プログラミングのヒントを以下に示します:

<オール> <リ>

スタックを利用します。プロシージャを呼び出すときに、呼び出し元のスタック フレームに変数を割り当て、それらへのポインタを呼び出したいプロシージャに渡したい場合がよくあります。これは、malloc() でメモリを動的に割り当てるよりも大幅に高速になります。 エラーが発生しにくくなります。適切な場所でこれを行ってください。

<リ>

C はガベージ コレクションを行わないため、データ項目を動的に割り当てるのは面倒であり、確実に解放されるようにそれらを追跡する必要があります。スタックに割り当てられた変数 (1 を参照) は、適用可能な場合、より「慣用的」です。さらに、それらを解放する必要はありません。これは、ローカル変数のボーナスです。

<リ>

(2) に対応して、関数がステータスまたはエラー コードを返し、(1) に従ってスタックを使用してデータを送受信するアーキテクチャを検討してください。

<リ>

setjmp() とは何かを知る と longjmp() 行う。これらは、構造化された例外処理機能の代わりに、一般的なエラー ハンドラー メカニズムに非常に役立ちます。

<リ>

C は例外をサポートしていません。 (3)を参照してください。

<リ>

リントはあなたの友達です。 Splint はさらにフレンドリーです。

<リ>

プリプロセッサが何をするか、できるとしてもプリプロセッサを使ってはいけないことを学びましょう。

<リ>

エンディアン、単語の配置、ポインター演算、およびその他の低レベルのアーキテクチャの奥義の詳細を学びます。一般的な意見に反して、これらはロケット科学ではありません。興味があれば、アセンブリ言語に手を出して、その実用的な知識を身につけてください。 C プログラムで何が起こっているかを理解するのに大いに役立ちます。

<リ>

C にはモジュール スコープの概念がないため、インクルードの使用、プロトタイプ宣言、および extern の使用を計画してください。 そして static プライベート スコープを作成し、識別子をインポートします。

<リ>

C での GUI プログラミングは、すべてのプラットフォームで面倒です。

<リ>

(10) に相応して、Tcl、Lua、Python などの少なくとも 1 つのスクリプト言語の C API を学習します。多くの場合、C の最適な使用法は、実質的に他の言語で書かれたアプリケーションのコア高性能エンジンとして使用することです。

<リ>

コンストラクターに相当するのは、セットアップするアイテムへのポインターを渡す初期化関数です。多くの場合、これは setup_foo(&my_foo) のような関数呼び出しの形式で確認できます。 .この関数を使用して、スタックに割り当てたアイテムを初期化できるため、割り当てと初期化を分離することをお勧めします。同様の原則がデストラクタにも適用されます。

<リ>

ほとんどの人は、ハンガリー語の表記法は、書かれたハンガリー語と同じくらい読みやすいと感じています。これに対する例外は、ハンガリー語のネイティブ スピーカーであり、通常、ハンガリー語の表記法は楔形文字と同じくらい読みやすいと感じています。残念ながら、ハンガリー語の表記法は Windows ソフトウェアで広く使用されており、Win32 API 全体で使用されており、上に書かれたソフトウェアの読みやすさに予想される影響があります。このプラットフォーム。

<リ>

C/Unix の本は、故 W Richard Stevens によって書かれたもののような本当に優れたものでさえ、Amazon マーケットプレイスを通じてかなり安く中古で入手できる傾向があります。順不同で、K&R、Stevens APUE、UNP 1 &2、Dragon book、Rochkind、Programming Pearls、Petzold と Richter (Windows で作業している場合)、その他の古典的な C/Unix 作品のコピーを入手してください。読んだり、鉛筆で落書きしたり、一般的に本とやり取りしたりします。

<リ>

Web 上には、非常に多くの優れた C/Unix プログラミング リソースがあります。

<リ>

Cプログラミングの十戒と、戒めの背後にある理由と理由に関するいくつかのメタディスカッションを読んで理解してください。これはある程度古くなっていますが、そのほとんどはまだ関連性があり、組み込みシステムの世界ではあいまいなコンパイラがまだ非常に一般的です.

<リ>

パーサーを書きたいなら、Lex と Yacc があなたの味方です。

<リ>

Navicore が以下 (+1) で指摘しているように、Hanson の「C Interfaces and Implementations」は、モジュラー アーキテクチャのインターフェイス/実装設計の概要であり、多数の例が含まれています。私は実際にこの本のことを聞いたことがあり、それについて良いことを聞いたことがありますが、読んだとは言えません。上で説明した C のイディオムは別として、この概念は間違いなく優れた手続き型設計の中核です。実際、Modula-2 などの他の手続き型言語では、実際にこの概念を設計で明確にしています。これは、印刷されている「C プログラム アーキテクチャ」の本に最も近いものかもしれません。

<リ>

C FAQ を読んでください。


OO から C に戻るという私の懸念は、David Hanson の「C Interfaces and Implementations」で対処されました。

C インターフェイスと実装

真剣に、そのアプローチは、多くの非 oo システムが最終的に巻き上げる大きな糸の玉を誤って構築することを回避する上で大きな違いをもたらしました.


これは、C での OO プログラミングに関する別の質問に対する興味深い回答です。仮想メソッドを含めないことで、オブジェクト指向を基本的に実装した C コードについて投稿しました。

もし私が C コーディングをしていたら、このテクニックを使って「オブジェクト」を定義します.

デザイン パターンを念頭に置くことは常に役に立ち、ほとんどの言語で実装できます。

オブジェクト指向の C プログラミングについて説明しているすばらしい PDF があります。