if 와 매크로와 세미콜론의 위험성.
간만에 프로그램에 손대고 있는데, 함정에 빠져버렸다 -_- ;;;
if ( nTest ) ListView_SetItemText(hListView,~); else ListView_SetItemText(hListView,~);
|
[ 문제의 구문 ]
위와 같이 적어주면
error C2181: if와 짝을 이루지 않는 잘못된 else문입니다. |
신나는 문구를 띄워주신다.
제일 먼저 ListView_SetItemText 매크로는 매크로란 점이다 -_- ;
https://msdn.microsoft.com/en-us/library/windows/desktop/bb775105(v=vs.85).aspx
을 보면 알겠지만, 매크로지만 함수와 같이 완벽히 작동하는거처럼 보여주신다.
( 위 MSDN 에도 매크로 뒤에 세미콜론이 붙어있다. )
하지만, 매크로는 매크로일 뿐 . . .
#define ListView_SetItemText(hwndLV, i, iSubItem_, pszText_) \
|
위 매크로를 보면 { } 저주받을 중괄호가 존재한다.
이 매크로를 따라 맨 처음 구문을 다시 적어보면
if ( nTest ) { LV_ITEM _macro_lvi;\ else { LV_ITEM _macro_lvi;\
|
대충 이와 같이 적용된다.
if 문의 중괄호 끝에 아름답게 빨간색으로 빛나는 세미콜론이 보이신다.
즉, if ( ~ ){ }; 으로 이미 if문이 끝나버린 상태에서 else 문이 선언되어 앞에 있는 if 문이 인식을 못하는 부분이다.
따라서, 매크로를 사용시엔 반드시 if, while, for 와 같은 구문에는 중괄호 안에 매크로를 적거나
if, while, for 가 아닌 구문에만 사용하거나, 적당히 경우를 봐서 세미콜론을 안붙히는게 방법일 수 있겠다.
결론적으로 그냥 닥치는데로 중괄호 붙히는게 답일 듯 하다.