2016-09-22 8 views
3

C++ /。NET/Visual Studioにはかなり大きなプロジェクトがあり、パフォーマンステストのために、特定のポイント間の実行時間を評価できるコードが含まれています。コンパイルから部品を除外 - まだsyntax-check

PERFORMANCE_TEST BeginMeasureTime("execute someCode") 
someCode 
PERFORMANCE_TEST EndMeasureTime("execute someCode") 

通常PERFORMANCE_TESTマクロを開発しながらするので、評価コードがスイッチオフさ//に設定されることになります。したがって、コード/インタフェースなどが変更され、PERFORMANCE_TESTマクロの後のコードが無効になる場合、開発者はそれに気付かないでしょう。

パフォーマンス評価コードをプロジェクトの特別なバージョンにのみ組み込んでも、一貫性を保つことができますか?どのようにして通常どんなことをしますか?

+0

一貫した滞在とは何を意味しますか? PERFORMANCE_TESTを変更したときにコードを削除して、何を達成しようとしていますか? – JamesD

+0

右のコードは削除されており、構文チェックもされていません。コードをコンパイルしたい(または少なくとも構文チェックした)が、実行されないようにしたい。かなり良い解決策です。 – Cookie

+0

CPPCheckは、前処理チェックの前に静的解析が行われるため、特定の#defineをスキャンするように設定できるため、チェッカーに依存することもあります。 – JamesD

答えて

4

一つの簡単な方法は、その後の代わり

#if PERFORMANCE_TEST_ENABLED 
#define PERFORMANCE_TEST 
#else 
#define PERFORMANCE_TEST // 
#endif 

あなたは

#if PERFORMANCE_TEST_ENABLED 
#define PERFORMANCE_TEST(x) {x;} 
#else 
#define PERFORMANCE_TEST(x) if(0) { x; } 
#endif 
を持つことができ

PERFORMANCE_TEST(xxx) 

PERFORMANCE_TEST xxx 

を変更することであろう

パフォーマンステストが無効になっている(または最低でもifに分岐しない)場合、最適化コンパイラは2番目のバージョンのコードを生成しませんが、まだコンパイルの一部になります。

また、ビルド時間が巨大なでない場合は、単に両方のバージョンを別々のディレクトリに作成するだけで済みます。

1

私はこのようなことをやって以来、次のことがあなたの望むものでなければなりません。 MACROが定義されている場合は関数がインクルードされ、それ以外の場合は関数がnoopになり、コードがコンパイルされます。

#ifdef MACRO 

#define MACRO_NAME(arg1, arg2, ...) [code to expand to] 

#else 

#define MACRO_NAME(arg1, arg2, ...) noop 

#endif 

更新: [OK]をので、私は少し疑問が少し間違ってました。

ほとんどの静的解析ツールは、特定の#defineをスキャンするように構成することができます たとえば、CPPCheckには次の引数を与えることができます。

-D<ID>    Define preprocessor symbol. Unless --max-configs or 
        --force is used, Cppcheck will only check the given 
        configuration when -D is used. 
        Example: '-DDEBUG=1 -D__cplusplus'. 

コードを2回スキャンして目標を達成することができます。 #defineをさらに追加すると、スキャンを追加する前に、これが最も優れていると言えます。

また、次のいくつかの設定をスキャンすることもできます。

-f, --force   Force checking of all configurations in files. If used 
        together with '--max-configs=', the last option is the 
        one that is effective. 

--max-configs=<limit> 
        Maximum number of configurations to check in a file 
        before skipping it. Default is '12'. If used together 
        with '--force', the last option is the one that is 
        effective. 

我々は同じコードベースからすべてのWIN32、ポケットPCとWM5およびWM6のためのコードをビルドするが、静的なすべてのチェックをしていた、前の会社での動作のこのタイプを使用ビルド構成。しかし、最終的な結果として、すべてのビルドで非冗長コードが削除されました。

+0

これはまさに彼らが今やっていることです。問題は、マクロをコンパイルするだけでなく、マクロをコンパイルするだけのnoopが必要だということです。 – Cubic

+0

@Cubicこれをお寄せいただき、ありがとうございました。両方の設定をスキャンする方法を説明するために私の答えを更新しました。 – JamesD

関連する問題