programing

코드의 일부를 비활성화하는 간단한 방법

minimums 2023. 7. 27. 21:47
반응형

코드의 일부를 비활성화하는 간단한 방법

이것은 특정한 문제를 해결하기 위한 전형적인 질문이 아니라 두뇌 운동입니다만, 해결책을 가지고 있는 사람이 있는지 궁금합니다.

개발 과정에서 코드의 일부를 비활성화하거나 전환하여 다른 접근 방식을 확인해야 하는 경우가 많습니다.이 작업을 수행하려면 주석을 사용합니다.#defines하지만 제가 가장 좋아하는 것은:

//*
[code here]
//*/

이제 첫 번째 슬래시만 제거하면 코드가 주석 처리됩니다.

질문: 유사한 if-else 코드 스위치를 구현할 수 있는 방법이 있습니까?저는 그것을 찾으려고 노력했지만 항상 문제가 있어서 해결책을 찾을 수 없었습니다.

그리고 여러분도 비슷한 묘기를 알고 있나요?

를 드를다음감로으로 .#if 0하지만 코드를 활성화/비활성화하려면 코드를 편집해야 합니다.그것은 단지 댓글 블록을 사용하는 것보다 별로 좋지 않습니다.

정의된 전처리기 상수를 사용할 수도 있습니다.

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

이제 코드를 빌드할 때 코드를 편집할 필요 없이 빌드 프로세스(IDE/makefile/build script/명령줄)에서 이 상수를 선택적으로 정의/정의 해제할 수 있습니다.

$ gcc -DENABLE_TESTS source.c

초기에 균형을 맞추기 위해 이 답변을 추가했습니다.#if 0답변을 제공합니다. 하지만 승인된 답변에서 나온 이 구성은 특정 질문에 대한 최선의 답변입니다./**/ foo(); /*/ bar(); /**/그런 댓글 트릭은 삼가해 주시기 바랍니다.

#if 0
...disabled code here
#endif

제가 '좋은 코드'라고 생각하는 것이 아니기 때문에 이 글을 올려야 할지 모르겠습니다만, 제가 막 무언가를 확인할 때 두 개의 작은 코드 조각 사이를 빠르게 전환할 수 있는 빠른 n-dirty 방법으로 다음 기술을 사용한 것은 인정하겠습니다.

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

이제 전면에 있는 별표 중 하나만 제거합니다.

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

물론, 이것은 "그냥 확인하는 것" 단계를 넘어서서는 안 됩니다.

전처리기 if-else도 작동합니다.

#if 1
  // ... enabled if 1
#else
  // ... enabled if 0
#endif

프리프로세서 로직을 사용하여 다음 작업을 수행할 수 있습니다.

#if 0
    //code goes here
#endif

즐거운 시간 되세요.

때때로 저는 두 의 게으른 댓글을 바꾸기 위해 아래의 속임수를 사용합니다.

//* <-- remove the first slash
[code block 1]
/*/
[code block 2]
//*/

완료하기 전에 한두 비활성화해야 하는 코드가 있다면 IDE에서 제공하는 단축키를 사용하여 코드를 주석 처리하고 나중에 주석 처리하는 것을 선호합니다.예, 코드 블록을 먼저 선택해야 하지만 코드의 일부를 비활성화해야 할 때마다 디버깅 변수/전처리 지시문/if 문을 하나 더 포함하지 않는 것이 좋습니다.이런 경우가 대부분입니다.

반면에, 올바른 것을 찾기 위해 두 개의 코드 블록 사이를 반복적으로 전환해야 한다면, 저는 다음을 사용합니다.if (0)/if (1)코드 차단을 비활성화/활성화합니다.

[code block 1]

이따가

if (0)
{
    [code block 1]
}
else
{
    [code block 2]
}

컴파일 시간에 검사를 수행하는 경우 Gigi의 응답을 사용할 수 있으며, 이는 조건부로 코드 섹션을 컴파일하지 않습니다.변수나 지식이 .4 == sizeof(int)않음)

실행되어서는 안 되는 디버깅 코드의 작은 조각들로 컴파일하고 싶다면, 당신은 다음과 같은 규칙적인 조건문을 사용할 수 있습니다.

bool debugging = false;

// banana banana banana

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

그런 다음 디버거를 사용하여 다음을 할당하여 건너뛴 섹션에 액세스할 수 있습니다.debugging

매크로가 이를 위한 방법입니다.

#define COMPILE 

#ifdef COMPILE

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

#endif

코드를 비활성화하려면 주석을 달기만 하면 됩니다. #define 컴파일 라인

프로그램에 분산된 코드 청크를 동기적으로 켜거나 끄는 것도 때때로 필요합니다.

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; }
1 ? foo() : bar();

은 실합다니를 실행합니다.foo()변할내용을 합니다.10행할을 bar()대신.

전처리기 지시어나 주석과 관련된 제안과는 달리, 두 가지 가능한 분기가 모두 컴파일되므로 컴파일러의 구문 검사를 최대한 활용할 수 있습니다.

때때로 저는 if-endif 정의의 무한한 시퀀스에 의해 코드를 과장하지 않기 위해 이 접근법을 사용합니다.

debug.hpp

#ifdef _DEBUG
    #define IF_DEBUG(x) if(x)
#else
    #define IF_DEBUG(x) if(false)
#endif

예제.cpp

#include "debug.hpp"

int a,b, ... ,z;

...

IF_DEBUG(... regular_expression_here_with_a_b_z ...) {
    // set of asserts
    assert(... a ...);
    assert(... b ...);
    ...
    assert(... z ...);
}

컴파일러가 비활성화된 코드 블록 내에서 사용된 사용되지 않은 변수에 대해 경고할 수 있기 때문에 항상 효과적인 것은 아닙니다.그러나 적어도 다음과 같은 예를 들어 더 잘 읽을 수 있고 사용되지 않는 변수 경고는 억제할 수 있습니다.

IF_DEBUG(... regular_expression_here_with_a_b_z ...) {
    // set of asserts
    assert(... a ...);
    assert(... b ...);
    ...
    assert(... z ...);
}
else {
    (void)a;
    (void)b;
    ....
    (void)z;
}

항상 좋은 생각은 아니지만 적어도 코드를 재구성하는 데 도움이 됩니다.

다음 논리는 가장 간단한 접근법을 포함해야 합니다.

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

제 생각에 올바른 방법은 PreProcessor Directives를 사용하는 것입니다.

제 코드에서는 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()프로그램에는 첫 번째 기능에 정의된 것을 기반으로 하는 주() 기능이 하나만 있습니다.#define문이 완전히 생략된 경우, 기본적으로 작성된 표준 주() 함수가 됩니다.

이를 통해 하나 또는 두 개의 구성 요소에만 초점을 맞춘 프로그램에 대한 테스트를 쉽게 작성할 수 있습니다.그리고 가장 좋은 점은 테스트 헤더가 내 코드로부터 깔끔하게 격리되어 있어서 실수로 테스트 코드가 남아있지 않다는 것입니다.

언급URL : https://stackoverflow.com/questions/11726665/simple-ways-to-disable-parts-of-code

반응형