pragma message 지시어를 통한 실수 방지 테크닉
2010. 1. 13. 23:17 |
Programming
Jeffrey Richter의 Windows via C/C++ 예제 코드에는 공통 헤더파일이 있는데, 이 곳을 살펴보면 유용하게 사용할 수 있을만한 팁들이 많이 있다.
그 중 가장 쉽고 편하게 쓸 수 있는 기능 하나를 소개하고자 한다.
코드를 작성하다가, '이 부분은 나중에 고쳐야지' 하고 주석으로 마킹해 놓은 뒤에 나중에 잊어버리고 그대로 릴리즈했던 경험이 있는 사람이라면 이 매크로를 아주 좋아하게 될 것이다.
그의 예제코드 중 CmnHdr.h 라는 파일을 보면 다음과 같은 코드가 있다.
주석에 잘 쓰여 있듯이 Pragma 지시어를 이용해서 코드 어떤 부분에,
이제 빌드를 하게 되면, Output 창에 이 메세지가 나타나게 되므로 실수를 줄일수 있다.
그 중 가장 쉽고 편하게 쓸 수 있는 기능 하나를 소개하고자 한다.
코드를 작성하다가, '이 부분은 나중에 고쳐야지' 하고 주석으로 마킹해 놓은 뒤에 나중에 잊어버리고 그대로 릴리즈했던 경험이 있는 사람이라면 이 매크로를 아주 좋아하게 될 것이다.
그의 예제코드 중 CmnHdr.h 라는 파일을 보면 다음과 같은 코드가 있다.
//// Pragma message helper macro //// /* When the compiler sees a line like this: #pragma chMSG(Fix this later) it outputs a line like this: c:\CD\CmnHdr.h(82):Fix this later You can easily jump directly to this line and examine the surrounding code. */ #define chSTR2(x) #x #define chSTR(x) chSTR2(x) #define chMSG(desc) message(__FILE__ "(" chSTR(__LINE__) "):" #desc)
주석에 잘 쓰여 있듯이 Pragma 지시어를 이용해서 코드 어떤 부분에,
#pragma chMSG(나중에 고칠 것) int c = a + b;이런 식으로 주석 대신 적어두는 것이다.
이제 빌드를 하게 되면, Output 창에 이 메세지가 나타나게 되므로 실수를 줄일수 있다.
또한 에러나 경고 메세지와 같이, 더블 클릭 하게되면 해당라인으로 바로 이동하게 된다. 이것은 pragma message의 기능이 아니라, Jeffry가 매크로에 파일과 라인수를 Output창이 알아볼 수 있는 형태로 잘 정의해두었기 때문이다.
하지만 그럼에도 불구하고, 빌드 되는 동안 다른 경고들이 화면 가득 나와서 아예 경고 메세지를 쳐다보지 않는 사람들에게는 혜택이 없다.
이 지시어는 아주 유용하긴 하지만 나는 조금 더 쓰기 편하도록 다음과 같이 매크로로 고쳐서 사용하고 있다.
이 지시어는 아주 유용하긴 하지만 나는 조금 더 쓰기 편하도록 다음과 같이 매크로로 고쳐서 사용하고 있다.
#define chSTR2(x) #x #define chSTR(x) chSTR2(x) #define chMSG(desc) message(__FILE__ "(" chSTR(__LINE__) "): --------" #desc "--------") #define chFixLater message(__FILE__ "(" chSTR(__LINE__) "): --------Fix this later--------") #define FixLater \ do { \ __pragma(chFixLater) \ __pragma (warning(push)) \ __pragma (warning(disable:4127)) \ } while(0) \ __pragma (warning(pop)) #define MSG(desc) \ do { \ __pragma(chMSG(desc)) \ __pragma (warning(push)) \ __pragma (warning(disable:4127)) \ } while(0) \ __pragma (warning(pop))
우선은 코드 중간 중간에 #pragma를 쑤셔넣는 것이 보기가 싫었는데, 이 pragma를 매크로 안으로 넣어버렸다. MSVC에는 __pragma라는 키워드를 사용할 수 있는데, 매크로 안에서 pragma 지시어을 사용하기 위해 고안되었다.
만일 예전에 매크로를 만들다가 매크로 안에 #pragma 지시어까지 넣을 수 없을까 고민했던 적이 있던 사람에게는 아주 좋은 소식일 것이다.
또 하나는 코드 맨 끝에 세미콜론을 붙여야 컴파일 되도록 강제하였다. #pragma 지시어는 C문법이 아니므로 세미콜론을 써줄 필요가 없는데, 코드 중간 중간에 들어갈 매크로인만큼 세미콜론이 없으면 미관상에도 안좋고, 복사해서 붙여넣기 등을 할 때 들여쓰기가 깨져버리는 문제가 있다.
그래서 보통 매크로를 만들 때는 세미콜론을 꼭 붙여야 정상적으로 컴파일 되도록 작성하는 것이 좋은데, 위 매크로에서는 do while 얍삽이를 통해서 세미콜론을 강제하고 있다.
저 얍삽이는 Ace 프레임워크의 ACE_DEBUG 매크로를 살펴보다가 알게 된 것인데, 세상에는 참 얍삽하게 머리 좋은 사람들이 많구나 하는 생각을 했다.
농담이다.
만일 예전에 매크로를 만들다가 매크로 안에 #pragma 지시어까지 넣을 수 없을까 고민했던 적이 있던 사람에게는 아주 좋은 소식일 것이다.
또 하나는 코드 맨 끝에 세미콜론을 붙여야 컴파일 되도록 강제하였다. #pragma 지시어는 C문법이 아니므로 세미콜론을 써줄 필요가 없는데, 코드 중간 중간에 들어갈 매크로인만큼 세미콜론이 없으면 미관상에도 안좋고, 복사해서 붙여넣기 등을 할 때 들여쓰기가 깨져버리는 문제가 있다.
그래서 보통 매크로를 만들 때는 세미콜론을 꼭 붙여야 정상적으로 컴파일 되도록 작성하는 것이 좋은데, 위 매크로에서는 do while 얍삽이를 통해서 세미콜론을 강제하고 있다.
저 얍삽이는 Ace 프레임워크의 ACE_DEBUG 매크로를 살펴보다가 알게 된 것인데, 세상에는 참 얍삽하게 머리 좋은 사람들이 많구나 하는 생각을 했다.
농담이다.
do while 얍삽이를 쓰게되면, while(0) 때문에 경고가 발생하는데, 이 역시 __pragma로 감싸버려서 없앨 수 있다.
마지막으로 앞뒤로 ----를 붙여서 좀 더 눈에 띄기 쉽도록 하였다.
이제 다음과 같이 사용할 수 있다.
#pragma chMSG(블라블라블라) int main() { FixLater; int a; MSG(나중에 고칠 것); return 0; }
'Programming' 카테고리의 다른 글
로그 뷰어로써의 Vim (2) -원하는 문자열만 골라내기 (3) | 2010.06.20 |
---|---|
로그 뷰어로써의 Vim (1) -멀티 하이라이팅 (0) | 2010.06.20 |
pragma message 지시어를 통한 실수 방지 테크닉 (2) | 2010.01.13 |
Absolute path와 Canonical path의 차이점 (3) | 2010.01.13 |
2009년 최고의 프로그래밍 언어, Google의 Go (3) | 2010.01.10 |
boost 라이브러리로 커맨드 라인 파싱 쉽게 하기 (1) | 2009.09.12 |
재호님 글 잘 봤습니다.
Reply저도 가끔씩 이용하는 방식인데.. 재호님처럼 매크로와 얍샵이 방법까지 활용할 생각은 못해 봤습니다. 좋은 방법 배우고 갑니다 ^^
오호~ 오랜만에 글?? ㅎㅎ
Reply