문제

다음 코드가 있습니다

#define PROC_ADD

void main(void)
{
    while(1)
    {
#ifdef PROC_ADD
// Do this code here then undefined it to run the code in the else
// processing work
#undef PROC_ADD
#else
// now that PROC_ADD has been undefined run this code
// processing work
#endif
    }
}

그러나 코드가 실행됩니다. 그러나 그것은 코드를 실행하지 않습니다 elsePROC_ADD 정의되지 않았습니다.

그 이유는 런타임이 아닌 컴파일 시간에만 정의하고 정의 할 수 있기 때문일 수 있다고 생각합니다. 그러나 나는 확실하지 않습니다.

도움이 되었습니까?

해결책

당신이하는 일은 다음과 같은 빌드 시간입니다.

int x = 1;

int main()
{
    if (x)
    {
        ...
        x = 0;
    }
    else
    {
        ...
    }
}

Ifdef 등은 빌드 타임에 발생하지만 예를 들어, 그것은 문제가되지 않습니다. IF (런타임 또는 빌드 타임 양식)를 평가하면 어떤 지점을 가져갈 지 결정합니다. 결정이 내린 후 무언가를 바꾸는 것은 그 결정을 바꾸지 않습니다.

다른 팁

그만큼 ifdef 사전 처리기가 도착하면 조건이 평가됩니다. 때를 undef PROC_ADD 내부 ifdef'D Code, Preprocessor는 이미 포함 할 코드의 섹션과 무시할 어느 섹션을 결정했습니다.

또한 예 : ifdef, undef, 등은 사전 처리 시간에 처리됩니다. 컴파일러는 이러한 소위 지침조차 볼 수 없습니다. 물론 이것은 런타임 코드가 이러한 지침을 결코 보지 못한다는 것을 의미합니다.

편집하다: Prephocessor는 텍스트 파일을 통해 단일 패스를 사용하여 작동합니다. 사전 처리기는 귀하의 텍스트 파일이 C 코드를 포함한다고 생각조차하지 않습니다! 그것은 당신의 지식이 없습니다 ifdef모래 elseS와 내부에 발생하지 않을 것입니다 while 고리.

#defineS는 전처리 중에 만 작동합니다. 그래서

#define PROC_ADD 
void main(void) 
{
#ifdef PROC_ADD 
// Do this code here then undefined it to run the code in the else 
// processing work 
#undef PROC_ADD 
#else 
// now that PROC_ADD has been undefined run this code 
// processing work 
#endif 
}

다음과 같은 방법으로 처리됩니다 PROC_ADDR 전처리 서가 정의됩니다 #else 분기 한 다음 실행하십시오 #undef, 그래서 #else 분기 코드는 전처리에서 살아남지 못하고 컴파일러에 도달하지 않습니다.

거의 모든 프로그래밍 언어 또는 구문에서, 일단 실행이 조건부의 한 분기에 입력되면 (이 경우 조건부 존재 #ifdef, 지점을 실행하는 동안 조건이 변경 되더라도 다른 지점은 실행되지 않습니다.

나는 이것이 "안녕하세요"를 인쇄 할 것으로 기대하지 않을 것이라고 확신합니다.

if (i == 1)
    i = 0;
else
    printf("Hello\n");

기본적으로 당신이 말하는 것은 else 분기는 항상 실행 한 다음 지점에서 꺼내고 코드에 직접 넣으십시오.

컴파일러와 실행은 모두 조건부를 통한 한 번의 패스 만 만듭니다. 일단 경기가 발견되면 더 이상 보이지 않습니다.

그래서 당신은 두 번째 주석 섹션으로 표시되는 코드를 언제나 운영? 그냥하지 않는 이유

#ifdef PROC_ADD
// Do the stuff to be done if PROC_ADD is defined
#undef PROC_ADD
#endif
// Do the stuff to always be done

편집하다

OK-런타임 동작 변경을 원한다면 런타임 구성 (예 : 깃발 역할을하는 변수)을 사용해야합니다. 우리 모두가 말하는 것처럼;), 사전 프로세서 지시문은 컴파일 시간에 한 번만 평가됩니다.

이런 식으로 생각하십시오 : else 그래도 다음 코드의 일부는 실행되지 않습니다. x 설정되었습니다 false 에서 if 부분.

상태가 확인됩니다 if(x) 라인 자체 - 일단 블록으로 들어가면 각 후속 각각을 다시 계산하지 않습니다. else 섹션 - 컴파일러는 이미 이에 대한 결정을 내 렸습니다.

bool x = true;
if(x)
{
  //do something
  x = false;
}
else
{
  //else code
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top