Media Log

Jeffrey RichterWindows via C/C++ 예제 코드에는 공통 헤더파일이 있는데, 이 곳을 살펴보면 유용하게 사용할 수 있을만한 팁들이 많이 있다.

그 중 가장 쉽고 편하게 쓸 수 있는 기능 하나를 소개하고자 한다.

코드를 작성하다가, '이 부분은 나중에 고쳐야지' 하고 주석으로 마킹해 놓은 뒤에 나중에 잊어버리고 그대로 릴리즈했던 경험이 있는 사람이라면 이 매크로를 아주 좋아하게 될 것이다.

그의 예제코드 중 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 매크로를 살펴보다가 알게 된 것인데, 세상에는 참 얍삽하게 머리 좋은 사람들이 많구나 하는 생각을 했다.
농담이다.

do while 얍삽이를 쓰게되면, while(0) 때문에 경고가 발생하는데, 이 역시 __pragma로 감싸버려서 없앨 수 있다.

마지막으로 앞뒤로 ----를 붙여서 좀 더 눈에 띄기 쉽도록 하였다.

이제 다음과 같이 사용할 수 있다.

#pragma chMSG(블라블라블라)
int main()
{
    FixLater;
    int a;

    MSG(나중에 고칠 것);
    return 0;
}

신고
  1. Favicon of http://eslife.tistory.com BlogIcon eslife at 2010.01.14 23:28 신고 [edit/del]

    재호님 글 잘 봤습니다.
    저도 가끔씩 이용하는 방식인데.. 재호님처럼 매크로와 얍샵이 방법까지 활용할 생각은 못해 봤습니다. 좋은 방법 배우고 갑니다 ^^

    Reply
  2. Favicon of http://www.voiceportal.co.kr BlogIcon 김태정 at 2010.01.21 00:43 신고 [edit/del]

    오호~ 오랜만에 글?? ㅎㅎ

    Reply

submit

사용자 삽입 이미지


python 언어 자체는 너무나 재미있지만, 몇가지 간단한 스크립트를 작성 해보면서, 비주얼 스튜디오에 익숙해 있는 내게 편리한 디버깅 인터페이스와 자동으로 메소드 목록을 보여주는 기능이 없는 환경은 너무나 불편하게 느껴졌다.

이클립스에서 사용할 수 있긴 하지만, 이클립스는 내게 익숙하지 않으므로 패스하고.
Visual Studio에서 파이썬을 붙여서 사용할 수 있다는 것은 이전부터 알고 있었지만 그다지 관심있게 보지는 않았었다.
왜냐하면 IronPython이라는 것은 닷넷 프레임워크 기반에서 동작하기 때문이었다.

어제는 리눅스에서 간단한 파이썬 스크립트를 작성하다가, vim에 그다지 익숙하지 않고 print로 밖에 디버깅 할 수 없는 나에게 조금은 화가 났었다.

곰곰히 생각을 해봤는데 이런 방법이 떠올랐다.
VS2008에 IronPython이라는 것을 붙여서, 닷넷 라이브러리를 사용하지 않은 순수 파이썬 코드만을 편하게 작성하고 리눅스나 다른 환경으로 옮겨서 실행하면 어떨까.

예상은 그럭저럭 들어맞았다.
설치 방법은 생각보다 간단하다.

1. VS2008 설치

2. Visual Studio 2008 Shell Isolated Mode Redistributable package 혹은
Visual Studio 2008 Shell Integrated Mode Redistributable package 다운로드

3. VS2008 SDK 설치

4. http://www.codeplex.com/IronPythonStudio에서 최신 설치 버전 다운로드.
 -  IronPythonStudioIsolatedSetup 혹은  IronPythonStudioIntegratedSetup

isolated 모드와 integrated 모드가 있는데 나는 isolated모드로 설치했다.
사실 잘 이해 못하고 사람들이 더 다운로드 많이 받았으므로 이걸 골랐었다. :(

설치 완료 후 비주얼 스튜디오를 켜니 python 프로젝트가 없길래 역시 쉽게 안되나 생각했었는데, 시작 -> 모든 프로그램에 보니 IronPython Studio라는게 생겨있었다.
아마도 이 부분이 isolated와 integrated에 따라 달라지는 것 같다.
intergrated를 선택해서 설치했다면 아마도 비주얼 스튜디오를 실행 하고 새 프로젝트를 눌렀을 때, C#, C++, 이 밑에 Python프로젝트가 같이 나올 것으로 예상된다.
따라서 저 옵션은 아마 비주얼 스튜디오에 독립적으로, 또는 통합적으로 라는 말이 아니었을까?

어쨌뜬 실행 화면을 보자.

사용자 삽입 이미지
사용자 삽입 이미지
디버깅은 아주 잘된다.
자동으로 메소드 목록이 나타나지 않는 것은 조금 유감이지만 이 정도만으로도 만족한다.
앞으로 좀 더 개선 될 것을 기대한다. :)

신고

submit