ac ファイル内のこの構造の目的は何ですか?:
#define _TIMERC
#include "timer.h"
#undef _TIMERC
ヘッダー ファイルの複数のインクルードを防止するためのガードについては認識しています。しかし、これは何が起こっているようには見えません。
ありがとう!
ここに説明するシナリオがあります...
timer.h が、発生したタイマー割り込みの数を返すマクロ tick_count() を提供するとします。
インターバル タイミングにタイマー A を使用する 1 つのモジュール (rpm_reader.h):
#define _TIMERA
#include "timer.h"
#undef _TIMERA
別のモジュール (lap_time.h) では、インターバル タイミングにタイマー C を使用しています。
#define _TIMERC
#include "timer.h"
#undef _TIMERC
rpm_reader は tick_count() を呼び出したときにタイマー A からティック カウントを返し、lap_time はタイマー C からそのカウントを取得します。
(私自身の質問に答えて申し訳ありませんが、質問をすることでこの啓示にたどり着きました。)
多くの場合、ライブラリ ヘッダー ファイルには複数のオプションがあり、マクロ定義によって有効化および無効化されます。これにより、そのようなオプションが有効になります。
より一般的には、ビルド システムを構成して (gcc などで) -D_TIMERCをコンパイラのコマンド ラインに追加することにより、これらをグローバル スコープで設定します。
私はそれがこれである可能性があるかどうか疑問に思っていました:
この場合のヘッダー ファイルは、各 #include の前に確立された異なる定義を持つ複数の包含を許可することを目的としています。
timer.h に、マイクロコントローラーの各タイマーのタイマー A、B、および C のコード ブロック (割り込みコード) がある場合。あるモジュールではタイマー A が必要で、別のモジュールではタイマー C が必要な場合があります。
あなたの自己回答は正しいと思います。インクルードされたヘッダーには条件付きのものがある可能性が高く、「呼び出し」ファイルは、どの特定の条件付き「もの」のセットを含めたいかを知っています。
必ずしも複数のインクルードを行う必要はありません。「呼び出し」コンテキストに応じて、特殊なケースになる可能性があります。
ただし、なぜ未定義になるのかは正確にはわかりません。組み合わせて一致させるケースは考えられないので、未定義が必要な理由がわかりません。
記録として、同じヘッダーファイルの複数のインクルードを回避する一般的な方法は、外部定義に依存するのではなく、ファイル自体にガードを配置することです... ^ _ ^
ヘッダーは次で始まります。
#ifndef header_name_h
#define header_name_h
そして最後に:
#endif
もちろん、defスタイルはさまざまです。
したがって、最初に含めるときに、#ifndef(まだ定義されていません)を通過し、マクロを設定します。2番目のインクルードでは、もしあれば、ファイルの終わりにジャンプするだけで、何も含まれません。
明白なことを述べる危険を冒して、「timer.h」は_TIMERCを持つことを期待していますが、コードの残りの部分はそうではありません。
一般的なケースでは明らかに良い習慣ではありませんが、サードパーティのコードを含めるときに同様のことを見てきました。衝突する #defs があると厄介になる可能性があります...