#if, #else, #endif에서 주의해야할점!

IT/C 언어




몇일전 코드를 수정하다가, 아래와 같은 C언어 문법을 사용해야했다.

조건에 따라 컴파일을 포함시킬지 않알지 정하는 문법.


#if

~~

#else

~~

#endif



그러나 수정코드를 삽입하였지만, 원하는 결과는 볼 수 없었다.

조건문과 로직에는 이상이 없었다.


그렇게 한참을 디버그.. 뻘짓 하다가 뒤늦게 깨달았다.


결론, 기본적으로 빠트린 것이 있었는데.. 

#if문에서 #defined되어 있지 않은 변수명을 사용해도 소용이 없다.

이게 가장 중요한 부분인데 예를들어 보도록 하자.


예를 들어, 


op_val = 1;

#if op_val

~~~~

#else

~~~~

#endif


해서 항상 false로 인식해 #if문 아래 코드를 수행할 수 없다.


이쯤되면 이미 알아차리는 분들도 계실 수 있고, 아직 눈치채지 못하신 분들이 있으실 수 있다.


바로 컴파일 순서가 답이다. 위와 같은 예제는 항상 false로 갈 수밖에 없는데,

전처리기 컴파일 순서는 전역변수와  #defined을 먼저 컴파일하게 되어있다.


#if의 조건을 보면, op_val이란 변수는 매크로함수나 defined으로 정의되어 있지 않다.

그렇기 때문에  #if문은 항상 false를 가지며 참일때 코드로 분기할 수 없게 되는 것이다.

그렇기 때문에, op_val=1이라는 코드는 아직 컴파일 되지 않아 값이 없는 변수가 된다.


참 간단한 것이지만, 아직 기본적인것이 헤깔리거나 몰라서 이렇게 헤메는 경우가 허다한것 같다.

하나씩 기록해나가면서, 깨우쳐보도록 하자.