'Programming/Knowledge Base'에 해당되는 글 2건

  1. 2008.07.28 MFC에서 Console 창 띄우기 (2)
  2. 2007.05.16 Structure packing
* 이 내용은 http://darkblitz.tistory.com/101 사이트의 내용을 참고하였습니다.

windows app를 debugging 할 때 console창이 편할 때가 있습니다.

머 굳디 TRACE를 macro를 쓰고 싶지 않을 때라던가 -_-;;

아니면 저는 다른 시스템에서 TRACE를 쓰고 있으면 내용의 분리를 위해서라도 Console을 애용하는 편입니다.

OutputDebugString은 DbgView를 띄우기가 귀찮고, VS의 output은 너무 작고 해서요-_-;;

여태까지는 AllocConsole을 이용했었는데, 오늘 새로 찾아보니 훨씬 간단한 방법이 있군요.

Windows Application에서 다음 줄을 추가합니다.

#pragma comment(linker, "/entry:WinMainCRTStartup /subsystem:console")

굳이 AllocConsole, Free Console을 하지 않아도 Console 창이 나오는 군요.

잘 쓰겠습니다 ;)

'Programming > Knowledge Base' 카테고리의 다른 글

MFC에서 Console 창 띄우기  (2) 2008.07.28
Structure packing  (0) 2007.05.16
Posted by yunseong

컴파일러에 따라서 구조체의 align을 맞추기 위해 packing하는 경우가 있습니다.
이경우 예상치 못한 구조체의 크기때문에 문제가 발생할 때가 있습니다.

예를 들면, 다음과 같은 코드를 실행해 봅시다.

#include <stdio.h>

typedef struct
{
 char cFoo;
 int nFoo;
}Foo;

void main()
{
 Foo stFoo;

 printf("%d\n", sizeof(stFoo));
}

코드상으로 보면, 해당 구조체의 크기는 5Byte가 되야 하지만, 실제 돌려보면 5byte가 나오지 않을 수 있습니다. (저는 8byte가 나오는 군요)

이는 컴파일러의 오류가 아니라, compiler가 메모리 align을 맞추기 위해 임의로 약간의 버퍼를 구조체에 추가하여 생기는 현상입니다. 이를 packing이라 합니다.

네트워크관련 프로그래밍에서는 이런 이유로 프로토콜이 깨지는 현상이 발생할 수도 있습니다. 이렇게 컴파일러 임의대로 pack을 하는 현상을 막기 위해 다음과 같은 코드를 다음과 같이 작성합니다.

#include <stdio.h>

#pragma pack(push, __Identifier, 1)

typedef struct
{
 char cFoo;
 int nFoo;
}Foo;

#pragma pack(pop, __Identifier)

void main()
{
 Foo stFoo;

 printf("%d\n", sizeof(stFoo));
}

#pragma ~~ 의 코드가 추가되었습니다. 이제 돌려보면 정확하게 5라는 숫자가 출력이 됩니다.

추가된 코드의 설명은 다음과 같습니다.

#pragma pack (push, __Identifier, 1)  <-- 스택에 현재의 packing 단위를 __Identifier로 저장하고 이 후부터는 1Byte로 align을 맞춘다.

......

#pragma pack(pop, __Identifier)  <-- 스택에서 __Identifier라는 이름으로 지정된 packing정보를 pop하여 복구한다.

packing은 네트워크 programming에서 프로토콜의 크기를 맞추기 위해 많이 사용된다고 합니다. 참고하세요~

'Programming > Knowledge Base' 카테고리의 다른 글

MFC에서 Console 창 띄우기  (2) 2008.07.28
Structure packing  (0) 2007.05.16
Posted by yunseong
이전버튼 1 이전버튼