私は現在、プロファイリングシステムをアプリケーションに実装しています。
コンパイラフラグ(NDEBUG)に基づいて定義された2つのマクロ関数があります。NDEBUGが定義されていない場合、これら2つの関数(profilingStart / profilingEnd)は、profilingStartが呼び出された時間とprofilingEndが呼び出された時間を示すプロファイリングレポートを生成します。
懸念されるのは、不一致が発生する可能性です。つまり、profilingStartが呼び出されたが、profilingEndが呼び出されなかった(またはその逆の)シナリオです。私のコードは実行時にこれらの状況をすでに認識していますが、この不一致が原因でコンパイル時にエラーが発生した場合は望ましいでしょう。
1つの提案は、do {...} while();を使用することです。プロファイリング関数が適切にペアになっていることを確認するために構築します。startマクロ関数にはdo{が含まれ、endマクロには} while()が含まれます。1つが欠落していると、コンパイル時にエラーが発生します。ただし、これにはいくつかの問題があります。profilingStart()およびprofilingEnd()呼び出しは、関数内で使用するとローカル変数のスコープに影響を与える可能性があるため、プロファイルされている関数の開始と終了でのみ使用できます( do {...} while()呼び出しが原因でスコープ外になる可能性があるため)。
私が持っていたもう1つのアイデアは、profilingStart関数で変数を宣言してから、profilingEnd関数でその変数の内容を変更しようとすることです。これにより、スコープの問題が回避され、変数が宣言されていない場合はコンパイラエラーが生成されます。ただし、end関数で変数の内容が変更されていることを確認する方法はありません。これは、profilingEnd関数の呼び出しを検証しないため、問題の半分にしか役立ちません。
いつものように、どんなコメントでも大歓迎です。前もって感謝します。
編集:範囲に関する私のコメントに関していくつかの混乱があるかもしれません。profilingStart()とprofilingEnd()は、常に同じ関数内で呼び出されます。関数の最初/最後で呼び出されない場合があります。これが私が意味したことの例です:
int DoSomething(void)
{
profilingStart();
int a;
DoMath(a);
profilingStop();
return a; // a is out of scope here, as the do{...}while(0) construct has gone out of scope
}