#define, #ifdef #undef #endif
-
05-07-2019 - |
문제
다음 코드가 있습니다
#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
}
}
그러나 코드가 실행됩니다. 그러나 그것은 코드를 실행하지 않습니다 else
후 PROC_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
모래 else
S와 내부에 발생하지 않을 것입니다 while
고리.
#define
S는 전처리 중에 만 작동합니다. 그래서
#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
}