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


 
 

C 표준, C++ 표준은 부동 소수점 표기법 (float, double 또는 long double)을 다루는 방식을 제공한다.

1. 매크로

C언어 표준 라이브러리 헤더 <math.h>에는 아래 매크로들이 존재한다 (C++ <cmath>에도 동일) .

  • INFINITY
  • NAN

이들 각각은 float 타입의 constant expression으로 expand된다. 이를 이용해 임의의 실수 인자로 NaN이나 Inf를 넘길 수 있다.


2. number classification macros

<math.h>(<cmath>)에는 아래 매크로들이 존재한다.

  • FP_INFINITE
  • FP_NAN
  • FP_NORMAL
  • FP_SUBNORMAL
  • FP_ZERO

이들은 int 타입의 constant expression으로 expand된다. <math.h>의 표준 매크로 함수 int fpclassify(real-floating x)로부터 실수 값이 어떤 분류에 해당하는지 알 수 있다.

3. fenv.h

fenv.h에는 다음 예외 분류 매크로가 존재한다.

  • FE_DIVBYZERO
  • FE_INEXACT
  • FE_INVALID
  • FE_OVERFLOW
  • FE_UNDERFLOW

이들은 블럭 내에서 #pragma STDC FENV_ACCESS ON 선언 후 feclearexcept, fegetexceptflag, feraiseexcept, fesetexceptflag, fetestexcept 등의 함수로 예외 처리에 플래그 값으로 사용 가능하다. 이에 대한 설명은 생략.

MinGW GCC 4.6.2로 MSYS 1.0에서 configure && make 돌린 결과물입니다.

MSYS에서 이렇게 오래 걸리는 빌드를 해 본 건 처음입니다. ㅇ>-< mingw-get 쪽은 아직도 4.6.2가 최신이라서 눈물의 빌드 ㅠㅠ

C++11이 완성도 높게 기본 표준으로 정해져 있어 좋네요. 물론 C11 그런 건 없다

빌드 환경은 Windows 7 64bit인데, 다른 시스템에서도 안전합니다. 물론 안정성은 보장 못 함.


그나저나 누가 msys에서 libncurses 컴파일하는 방법 좀 알려주세요 현기증 난단 말이에요

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로 확장되지 않았다면 이 프로그램은 유니코드를 지원하기는 사실상 글러먹은 프로그램이 된다.

온갖 IDE와 SDK를 설치해 놓고, 지웠던 VS6를 그 위에 설치하는 도중 이런 메시지를 보게 되었다.


처음에는 무슨 소리인지 알아듣지 못할 뻔했지만 알아들었다.

MSDN: JIT 연결 설정 (VS2005, VS2008)

JIT 디버깅이란 VS나 Java에서 주로 쓰이는 용어로, 이미 만들어진 바이너리 오브젝트에 디버거를 붙이는 것이다. Post mortem (사후) 디버깅과 비슷한 뜻이라고 흔히 알려져 있다. 다만 정확히 하자면 JIT 디버깅은 사후 디버깅의 일종이다. CRT에서 JIT 디버거를 붙일 적절한 방법이 없다면 사후 디버깅은 오브젝트 덤프를 통해 하는 게 일반적이다.

Qt Creator 설치 과정에서도 JIT 디버거 설정을 할 수 있다.

결국 이미 런타임/실행파일 디버거가 있는데, VC6를 디버거로 쓰겠냐는 질문이다. VC6 디버깅이라니 싫어;

참고: 쉬운 JIT 디버그를 위한 심볼 파일 (pdb) 생성 옵션 /Zi. 최소 재빌드 옵션 /Gm.

_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의 선례가 있기 때문에...