C ジェネリック プログラミング

共通点を見つけて抽象化することは、プログラマーにとって最も価値のあるスキルの 1 つです。まだ学習中なので、次のことを行うことをお勧めします:

(1) その他の構造体のスタックを実装します。はい、それは二重の作業ですが、あなたの段階では、すべての作業プログラムが重要です。経験を積む。

(2) プログラムを比較する。彼らに共通する部分は何ですか?異なる部分は何ですか?あなたの目標は、共通の部分を異なる部分から分離することです。この 2 つのグループが通信するために使用する手段は何ですか?共通の部分はシステムの一部 (stack.h/stack.c) に入り、異なる部分は独自のファイル (account.h/c、person.h/c など) に入ります。 .そして、それらを組み合わせる部分は、stack.h とパラメータ化エンティティのインクルードを行う必要があります。

(3) 抽象構造体機能を実装するために使用できる、言語が提供することがわかっているすべての可能な方法を見つけるようにしてください。最初は常に 1 つの方法しかないように見えますが、重要な問題には必ず複数のアプローチがあります。スタックの場合、標準 C を使用すると、たとえば、zou は void ポインターを使用でき、プリプロセッサー マクロを使用でき、トークンの貼り付けを検討する必要があり、関数ポインターと構造体ポインターなどを使用できます。

(4) できるだけ多く実装する。繰り返しますが、これは学習体験のためです。 C には非常に多くのトラップがあり、それらに遭遇するのは早ければ早いほどよい.

(5) これらのさまざまなアプローチをすべて列挙して実装したら、それらを評価する必要があります。どのアプローチが最も使いやすかったか?実装しやすかったのはどれですか?どれが最速ですか?デバッグが最も簡単なのはどれですか?


私は C のハッキングはあまりしませんが、これを行う方法は void* だと思います .

したがって、push/pop void* のスタックを書き直すだけです some_struct* の代わりに .型を正しく保つことが問題になりますが、それは低レベル* プログラミング言語を使用するための対価にすぎません。

*これが悪いことだと言っているわけではありません.


抽象化 ほとんどの場合、プログラマーの目に留まります。優れたプログラマーはパターンを見ることができます 言語とその構文は確かに役立ちますが、ステートメントと式が最終的にどのように記述されるかは、良いプログラマーと悪いプログラマーを区別するものです。そうは言っても、これはどのように役立ちますか?要点は、C の構文に慣れて、それらを見たときに理解できるようにすることです。void* ケビン・モントローズの言及は一般的なものです。私が良いと思う戦略は考えることです stdlibについて 、そこで物事はどのように解決されましたか?よくある パターン stdlib で OK を表すゼロ (0) を持つことです。または、ファイル記述子がすべての read でどれだけうまく機能するかを考えてみてください 、 write etc は、その起源 (ソケット、ファイル、パイプなど) に関係なく機能します。この SO の質問 (リンク) には、読むべき優れたコードへの優れたリンクがいくつかあります。


(ソース:skitch.com)

思考力の画像 、言語に関係なく、古き良きプログラミングの本です。