Admin | Write | GuestBook
[공지] 해당 블로그에 용건이 있으신 분께서는 http://blog.fore.kr/ 의 방명록(Guestbook)으로 부탁드립니다.
if 와 매크로와 세미콜론의 위험성.
Category : Programming/Programming Talk | URL : | Written by 포레 ( 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 가 아닌 구문에만 사용하거나, 적당히 경우를 봐서 세미콜론을 안붙히는게 방법일 수 있겠다.

 

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

 

Category
분류 전체보기 (605)
Notice (6)
Programming (79)
DISKER (1)
FSCH (7)
Caption (0)
Rest Time ! (443)
Hobby (64)
Tour (5)
Blind Post (0)
Recent Post
Recent Comment
Link
Calender
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total :
Today :
Yesterday :