「C インターフェイスと実装」には、データ構造の興味深い使用パターンがいくつか示されていますが、他にもあると確信しています。
3 に答える
ゴダード宇宙飛行センター (NASA) の C コーディング標準 (このURL ) を参照してください。いくつかの優れた興味深いガイドラインがあります。
私が独自のコードに採用した特定のガイドラインの 1 つは、ヘッダーは自己完結型であるべきだというものです。つまり、次のように記述できる必要があります。
#include "header.h"
また、コードは、以前に何が行われたかに関係なく、他の必要なヘッダーが含まれている状態で正しくコンパイルされるはずです。これを確実にする簡単な方法は、最初のヘッダーとして実装ソースにヘッダーを含めることです。それがコンパイルされる場合、ヘッダーは自己完結型です。コンパイルされない場合は、コンパイルされるように修正します。もちろん、これには、ヘッダーがべき等であることを確認する必要もあります。ヘッダーが含まれる頻度に関係なく、同じように機能します。そのための標準的なイディオムもあります。
#ifndef HEADER_H_INCLUDED
#define HEADER_H_INCLUDED
...operational body of header.h...
#endif /* HEADER_H_INCLUDED */
もちろん、#define をファイルの一番下ではなく、一番上に置く必要があります。それ以外の場合、これに含まれるヘッダーに header.h も含まれていると、無限ループになってしまい、健全ではありません。次の戦略を採用することにしたとしても、
#ifndef HEADER_H_INCLUDED
#include "header.h"
#endif /* HEADER_H_INCLUDED */
ヘッダーをインクルードするコード (これは推奨されません) では、ヘッダー自体にもガードを含めることが重要です。
2011-05-01 更新
上記の GSFC URL は機能しなくなりました。詳細については、ヘッダーに #include を使用する必要があるかという質問の回答を参照してください。これには、この質問への相互参照も含まれています。
2012-03-24 更新
参照されている NASA C コーディング標準は、インターネット アーカイブからアクセスしてダウンロードできます。
JohnLakosによる大規模C++ソフトウェア設計をご覧になることをお勧めします。
Makeheadersは興味深いアプローチです。ツールを使用してヘッダーを生成します。Makeheadersは、DR Hipp のcvstracとFossil で使用されています。