이 블로그는 방문자 통계를 위해 티스토리 기본 기능과 Woopra를 사용합니다. 원하지 않으신다면 사용하시는 웹 브라우저에 내장된 DNT 헤더를 켜고, JavaScript를 끄셔도 무방합니다.
이 블로그 방문자의 약 60%는 네이버 검색을 사용하십니다. 을 이용하시면 더 유용한 정보를 쉽게 얻게 되실 수도 있습니다. [mediatoday]
« 2018/09 »
            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            
블로그 이미지
제가 주제인 블로그... 그냥 주제 없는 블로그입니다. 전공 분야나 예전 관심 분야 등등에 관한 글이 우선입니다만, 두어 문단을 넘길 만한 글이라면 대강 정리해 기록합니다. 학부생입니다. 트위터에서 볼 수 있습니다. http://aurynj.net/ 어­리


 
 

Visual Studio 2010에서 빈 프로젝트나 Win32 콘솔 응용 프로그램을 생성하면 이전의 Visual Studio에서와 달리 실행 파일이 마지막 표준 출력 결과를 볼 수 있도록 기다려 주지 않고 꺼진다.(단축키 Ctrl+F5) 이는 실행 파일의 출력이 지정되지 않았기 때문인데, 원래 콘솔 프로그램은 표준 출력을 콘솔로 내보내는 게 맞지만, 오늘날 콘솔 프로그램은 GUI의 프론트엔드로 쓰이는 일이 잦아지기 때문인지 Visual Studio 2010부터는 출력을 콘솔로 기본 지정하지 않고 있다.

이를 해결하려 한다면 당연히 출력을 콘솔로 지정하면 된다. 다음 둘 중 한 방법으로 프로젝트의 출력을 콘솔로 지정할 수 있다.

  1. Visual Studio 2010에서 프로젝트를 열고 메뉴 프로젝트> 속성> 구성 속성> 링커> 시스템: 하위 시스템
    필드를 찾아 값을 다음과 같이 준다.
    /SUBSYSTEM:CONSOLE
  2. XML 포맷인 .vcproj 파일을 텍스트 에디터로 열고 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">과 바로 다음의 </PropertyGroup> 사이, <Link>와 </Link> 밖에 다음을 추가한다. (Release에도 추가하는 건 자유)
    <Link>
    <SubSystem>Console</Subsystem>
    </Link>

반면에 프로젝트마다 이런 설정을 하기 귀찮다면 이 값을 기본으로 줄 수도 있다.

  • 텍스트 에디터를 관리자 권한으로 실행해 다음 ...\vcprojects 디렉터리에서
    • 64비트의 경우 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcprojects
    • 32비트의 경우 C:\Program Files\Microsoft Visual Studio 10.0\VC\vcprojects
    win32console.vsz 파일을 열고 아래 한 줄을 추가한다.
    Param="SUBSYSTEM = CONSOLE"
  • emptyproj.vsz 파일을 같은 방식으로 편집하면 빈 프로젝트에도 옵션이 적용되지만, 권장하지 않겠다.

Win32 콘솔 응용 프로그램을 생성하고 [확인], [다음]을 눌러 빈 프로젝트 체크박스를 선택하면 빈 프로젝트를 생성하는 것과 거의 같은 상태가 된다.

프리프로세서 #include <stdlib.h>를 주고 main() 끝에 system("pause");를 쓰면 프로젝트 기본 옵션을 바꾸지 않고 같은 효과를 볼 수 있다. 물론 실행 파일의 덩치가 커지기 때문에 완전히 같은 효과는 아니다. 나는 system("pause>nul");을 쓴다.

Windows에서는 문자/문자열 처리를 위해 특별한 자료형과 예약된 정의를 사용할 수 있다. C언어에서 char 형에는 1바이트 ASCII (+ 2바이트 코드 페이지) 문자가 저장되는 반면 wchar에는 유니코드 문자가 2바이트 기준으로 저장된다. BMP 밖은 대강대강 처리한다.

이것에 신경쓰지 않을 수 있는 타입이 t_char (TCHAR)이다. 매크로 확장은 컴파일러와 옵션에 따라 결정된다.

변수 상수 (L"...")
1B/확장 문자열 유니코드(2B) 문자열 1B/확장 문자열 유니코드(2B) 문자열
플랫폼 대응 문자열 플랫폼 대응 문자열
char * wchar * const char * const wchar *
t_char * const t_char *
PSTR / LPSTR PWSTR / LPWSTR PCSTR / LPCSTR PCWSTR / LPCWSTR
PTSTR / LPTSTR PCTSTR / LPCTSTR

조합에서 공통적으로 보이는 문자들은 다음의 두문자어이다.

  • L: long
  • P: pointer
  • C: const
  • W: wide
  • T: t_char
  • STR: char * (string)

윈도우 16비트 호환 API에서는 PSTR을, 32비트에서는 LPSTR을 쓴다. LPTSTR 또는 LPCTSTR의 식별자 헝가리안 헤드는 STR을 sz로 쓰는 관습에 의해 lpsz 또는 psz일 때가 많은데, 어차피 STR은 포인터이기 때문에 (PSTR이라고 이중 포인터가 아니다) 그냥 sz로 쓰기도 한다. 함수에 대해서도 main/wmain, print/wprintf 등에 대해 _tmain, _tprintf 등이 정의되어 있다. tchar.h 참고.

참고로 비주얼 스튜디오 최신을 사용하고 있고 관련 설정을 건드리지 않았다면, TCHAR를 썼을 때 WCHAR이 아닌 CHAR로 확장되는 경우는 드물다. 그럼에도 불구하고 만약 WCHAR로 확장되지 않았다면 이 프로그램은 유니코드를 지원하기는 사실상 글러먹은 프로그램이 된다.

_MSC_VER

Sablog Models/플랫폼·툴킷 | 2009.06.07 01:38 | Posted by 어­리

호환성 프로그램 어쩌구 해서 알 만한 분은 다 아는 MS Visual C++의 컴파일러 자체 매크로 상수이다.

  • VC++4.0: _MSC_VER = 1000
  • VC++5.0: _MSC_VER = 1100
  • VC++6.0: _MSC_VER = 1200
  • VC++7.0: _MSC_VER = 1300
  • VC++8.0: _MSC_VER = 1400
  • VC++9.0: _MSC_VER = 1500

VC++에는 각 버전에 따라 이 값이 다르게 정의되어 있다. 이를 이용해 gcc나 g++와 호환인 코드를 짜거나 표준에 어긋나지 않는 코드를 만들 수 있다.

#include <stdio.h>

int main()
{
#if defined(_MSC_VER) && (_MSC_VER < 1500)
    __int64 i64 = 0x57bf406691032708;
    printf("%lld\n", i64);
#else
    long long int i64 = 0x57bf406691032708;
    printf("%I64d\n", i64);
#endif
    return 0;
}

여기서는 8.0 미만의 VC++이 아니라면 최신 표준안의 long long int, %lld를 지원한다고 간주한다.

또한 (_MSC_VER < 1500)은 필요한 매크로 구문은 아니다. 혹시 모르는 VC++ 10.0 이상 어딘가에서 __int64 지원이 빠질 가능성을 열어 뒀을 뿐이다. 사실 __inline, _inline의 선례가 있기 때문에...