|
몇일전 코드를 수정하다가, 아래와 같은 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이라는 코드는 아직 컴파일 되지 않아 값이 없는 변수가 된다.
참 간단한 것이지만, 아직 기본적인것이 헤깔리거나 몰라서 이렇게 헤메는 경우가 허다한것 같다.
하나씩 기록해나가면서, 깨우쳐보도록 하자.
'IT > C 언어' 카테고리의 다른 글
IPC, 공유메모리 생성 함수 shmget() (0) | 2013.06.02 |
---|---|
IPC, 메세지 큐 생성 msgget() 함수 (0) | 2013.05.19 |
C언어 - 파일 정보 struct stat, 구조체 (2) | 2013.05.05 |
C언어 - 파일 정보 읽기 함수 stat() ,lstat() ,fstat(); (0) | 2013.05.05 |
C언어 - 디렉토리 읽기 함수 readdir(); (0) | 2013.04.28 |