35

これは特定の問題を解決するための典型的な質問ではなく、むしろ頭の体操ですが、誰かが解決策を持っているのだろうか.

開発では、さまざまなアプローチをチェックするために、コードの一部を無効にしたり切り替えたりする必要があることがよくあります。これを行うには、コメントまたはを使用します#definesが、私のお気に入りは次のとおりです。

//*
[code here]
//*/

最初のスラッシュだけを削除すると、コードはコメントアウトされます。

質問: 同様の if-elseコード スイッチを実装する方法はありますか? 私はそれを見つけようとしましたが、常に問題があり、有効な解決策を見つけることができませんでした。

そして、あなたは似たようなトリックを知っていますか?

4

14 に答える 14

56

コードをラップすると#if 0うまくいきますが、コードを編集して有効/無効にする必要があります。これは、コメント ブロックを使用するよりもはるかに優れているわけではありません。

定義済みのプリプロセッサ定数も使用できることに注意してください。

#ifdef ENABLE_TESTS
// code that you want to run ONLY during tests 
#endif

コードをビルドするときに、コードを編集する必要なく、ビルド プロセス (IDE/makefile/ビルド スクリプト/コマンド ライン) でこの定数を選択的に定義/定義解除できます。

$ gcc -DENABLE_TESTS source.c

この回答を追加して、すべての初期の#if 0回答のバランスを取りますが、受け入れられた回答からのこの構成は、特定の質問に対する最良の回答です: /**/ foo(); /*/ bar(); /**/. このようなコメント トリックは慎重に使用してください。

于 2012-07-30T17:44:30.063 に答える
34
#if 0
...disabled code here
#endif
于 2012-07-30T17:39:38.497 に答える
26

「良いコード」とは思わないので、これを投稿する必要があるかどうかはわかりませんが、2 つの小さなスニペットをすばやく切り替えることができるようにするための簡単な方法として、次の手法を使用したことは認めます。何かをチェックアウトしているときのコードの:

// in the following , foo() is active:
/**/ foo(); /*/ bar(); /**/

次に、先頭のアスタリスクの 1 つを削除します。

// now bar() is active:
/*/ foo(); /*/ bar(); /**/

もちろん、これは「チェックアウトするだけ」の段階を過ぎてはいけません...

于 2012-07-30T18:12:08.683 に答える
14

プリプロセッサ if-else も機能します

#if 1
  // ... enabled if 1
#else
  // ... enabled if 0
#endif
于 2012-07-30T17:46:00.850 に答える
6

ここで役立つプリプロセッサロジックを使用してください。

#if 0
    //code goes here
#endif

楽しみ

于 2012-07-30T17:41:07.523 に答える
6

以下のトリックを使用して、2 つの遅延コメントを切り替えることがあります。

//* <-- remove the first slash
[code block 1]
/*/
[code block 2]
//*/
于 2012-07-31T07:42:29.260 に答える
5

コードをファイナライズする前に1 回2 回無効にする必要がある場合は、IDE が提供するホットキーを使用してそのコードをコメント アウトし、後でコメント インすることを好みます。コードの一部を無効にする必要があるたびに、デバッグ変数/プリプロセッサ ディレクティブ/if ステートメントをもう 1 つ含める必要があります。ほとんどの場合、これが起こります。

一方、適切なものを見つけるために 2 つのコード ブロックを繰り返し切り替えるif (0)必要がある場合は、 /を使用してif (1)コード ブロックを無効/有効にします。

[code block 1]

後で

if (0)
{
    [code block 1]
}
else
{
    [code block 2]
}
于 2012-07-31T04:47:01.680 に答える
3

プログラム全体に散在するコードのチャンクのオン/オフを同期的に切り替えることも必要になる場合があります。

Graham によるこの以前の投稿に触発されて、次のようなものを作成しました。

void doNothing(){}
#define DO_IF(flag, code) flag ? code : doNothing();

これは、たとえば次のように使用できます。

DO_IF(collectStats, recordStats());
DO_IF(collectStats, store(pullStat()));

さらに優れている:

#define DO_IF(flag,code) if( flag ) { code; }
于 2014-02-21T15:30:57.390 に答える
3

コンパイル時にチェックを行っている場合は、条件付きでコードのセクションをコンパイルしない Gigi の回答を使用できます。プリプロセッサは、変数、sizeof、またはコンパイラによって処理されるその他のものについての知識を持たないことに注意してください (そのため、次のようなものを使用して4 == sizeof(int)も飛べません) 。

実行してはならないデバッグ コードを少しだけコンパイルしたい場合は、次のような通常の条件ステートメントを使用できます。

bool debugging = false;

// banana banana banana

if (debugging)
{
    // do a bunch of stuff here
}

debugging次に、デバッガーを使用して、 trueに割り当てることにより、スキップされたセクションにアクセスできます。

于 2012-07-30T17:45:42.640 に答える
3

マクロはこれを行う方法です..

#define COMPILE 

#ifdef COMPILE

//code to comment begins
cout<<"ha ha ha"<<endl;
//code to comment ends 

#endif

コードを無効にするには、 #define compile 行をコメントアウトするだけです

于 2012-07-30T17:48:59.380 に答える
2
1 ? foo() : bar();

これが実行されfoo()ます。1を aに変更して代わり0に実行bar()します。

プリプロセッサ ディレクティブやコメントを含む提案とは異なり、考えられる分岐は両方ともコンパイルされるため、コンパイラの構文チェックの利点を最大限に活用できます。

于 2012-07-30T21:17:30.870 に答える
1

次のロジックには、最も単純なアプローチが含まれている必要があります

if(isMode1)
{
    //Code for mode1
}
else
{
    //Code for other modes
}

正しい方法はプリプロセッサディレクティブを使用することだと思いますが

于 2012-07-30T17:42:14.387 に答える
1

私のコードでは、main.cpp ファイルでこれを行うのが好きです。

#define CRAZY_EXPERIMENT

#ifdef TEST
#include "Test.h"
#elif ANOTHER_TEST
#include "AnotherTest.h"
#elif CRAZY_EXPERIMENT
#include "CrazyExperiment.h"
#else

int main(int argc, int * argv[]){
    runTheProgramLikeNormal();
}

#endif

表示されるすべてのヘッダー ファイルには、独自のmain(). 最初に定義されている内容に基づいて、プログラムには main() 関数が 1 つしかありません#define。ステートメントが完全に省略されている場合は、デフォルトで、書かれている正規の main() 関数が使用されます。

これにより、1 つまたは 2 つのコンポーネントのみに焦点を当てたプログラムのテストを簡単に作成できます。そして、最良の部分は、テスト ヘッダーがコードからきちんと隔離されているため、誤ってテスト コードが取り残される (またはリンクされる) ことはありません。

于 2012-08-02T01:03:00.317 に答える