0

コンパイラ スイッチを使用して、大きなコード チャンクを含めるかどうかを制御するアプリケーションがあります。オートマチックトランスミッションまたはマニュアルトランスミッションの車を考えてください。デバッグ モードでは正常に動作しますが、リリース モードではオート トランスミッションとマニュアル トランスミッションの両方がコンパイルされているように見えるため、車の運転がうまくいきません...

では、オプション制御機能をコンパイラ スイッチから取得しようとするのは間違っているのでしょうか?

詳細: コンパイラ スイッチに関する私の理解に誤りがありました。

以下のコメントの簡単なプロジェクト。 (StackOverFlow の操作が苦手)

例えを続けると、(Winform) プロジェクトは手動送信で構築されました。セットアップ プロジェクトを使用してデバッグ モードでデプロイされました。(間違い)。

数年後、オートマチックトランスミッションが必要になりました。(基本クラスを発生させる共通性はありません)。いつの日かマニュアルトランスミッションが再び必要になるかもしれないと考えていました)

どのブロックのコードを使用するかを決定するには、コンパイラ スイッチを使用することをお勧めします。ここでも、自動送信バージョンがデバッグ モードで展開されました。

さらに数年実行した後、私はそれをリリースする必要があると判断しました。その時、私は問題に気づきました。

(ありがとう)求められた単純な例は、コンパイルされたのは両方のブロックではなく、#else のブロックだけであることを示しました。つまり、リリース ビルドはスイッチをオフと見なします。

したがって、何かが欠けていない限り、答えは自明です。展開オプションにコンパイラ スイッチを使用しないでください。

4

1 に答える 1

0

代わりにコンポジションを使用し、オブジェクト指向を利用することをお勧めします。AutoTransmission用と用の 2 つのクラスを用意しManualTransmissionます。それぞれが基本クラスから派生しTransmission ます。次に、これらの伝達の 1 つを利用するオブジェクトを作成するときに、適切と思われるいずれかを使用できます。

次に、 を使用するオブジェクトを作成するときに、Transmission必要な送信をインスタンス化するだけです。これは構成で定義することも、コンパイラ定数にすることもできます。ただし、コンパイラ定数を使用しないことをお勧めします。これは、自動リファクタリングを実行すると、ブロックが無効に#ifdefなる可能性があり、コンパイラ オプションを変更すると処理されず、ビルドされない可能性があるためです。

于 2013-04-07T20:45:08.903 に答える