Programming/Programming Talk

if 와 매크로와 세미콜론의 위험성.

포레 2015. 7. 27. 19:07

 

 

간만에 프로그램에 손대고 있는데, 함정에 빠져버렸다 -_- ;;;

 

 

 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_) \
 { LV_ITEM _macro_lvi;\
   _macro_lvi.iSubItem = (iSubItem_);\
   _macro_lvi.pszText = (pszText_);\
   SNDMSG((hwndLV), LVM_SETITEMTEXT, (WPARAM)(i), (LPARAM)(LV_ITEM *)&_macro_lvi);\
 }

 

 

위 매크로를 보면 { } 저주받을 중괄호가 존재한다.

 

이 매크로를 따라 맨 처음 구문을 다시 적어보면

 

 

 if ( nTest )

{ LV_ITEM _macro_lvi;\
   _macro_lvi.iSubItem = (iSubItem_);\
   _macro_lvi.pszText = (pszText_);\
   SNDMSG((hwndLV), LVM_SETITEMTEXT, (WPARAM)(i), (LPARAM)(LV_ITEM *)&_macro_lvi);\
 };

 else

{ LV_ITEM _macro_lvi;\
   _macro_lvi.iSubItem = (iSubItem_);\
   _macro_lvi.pszText = (pszText_);\
   SNDMSG((hwndLV), LVM_SETITEMTEXT, (WPARAM)(i), (LPARAM)(LV_ITEM *)&_macro_lvi);\
 };

 

 

대충 이와 같이 적용된다.

 

if 문의 중괄호 끝에 아름답게 빨간색으로 빛나는 세미콜론이 보이신다.

 

즉, if ( ~ ){ }; 으로 이미 if문이 끝나버린 상태에서 else 문이 선언되어 앞에 있는 if 문이 인식을 못하는 부분이다.

 

따라서, 매크로를 사용시엔 반드시 if, while, for 와 같은 구문에는 중괄호 안에 매크로를 적거나

 

if, while, for 가 아닌 구문에만 사용하거나, 적당히 경우를 봐서 세미콜론을 안붙히는게 방법일 수 있겠다.

 

결론적으로 그냥 닥치는데로 중괄호 붙히는게 답일 듯 하다.