이번 시간에는 “Predefined Macros“와 #line, #error에 대해서 살펴보자.
ANSI에서 미리정의한 매크로(Predefined Macros)는 6개다.
__DATE__, __FILE__, __LINE__, __STDC__, __TIME__, __TIMESTAMP__실행결과만 한번 살펴보는 것으로 넘어간다.
__FILE__ : 현재 소스 파일의 완전경로
__LINE__ : 현재 소스코드에서의 줄 번호
__STDC__ :컴파일러가 ANSI C 표준을 따를 경우 1로 정의되며 그렇지 않을 경우 정의되지 않는다. C++로 컴파일 할 때는 이 매크로가 없다.
printf("%s
", __DATE__);
printf("%s
", __FILE__);
printf("%d
", __LINE__);
printf("%s
", __TIME__);
printf("%s
", __TIMESTAMP__);
#ifdef __STDC__
printf("ANSI C
");
#else
printf("C++
");
#endif
실행결과:
Aug 23 2006
C:TestTest.cpp
14
19:11:35
Wed Aug 23 19:11:34 2006
C++
만일 디버깅 용도로 사용을 한다면, 아래와 같이 이용 가능하겠지.
#define VAR(x, format) printf("[%s][%d]name=%s, value=%"#format"
", __FILE__, __LINE__, #x, x)
int nsize = 10;
double fsize = 10.0;
VAR(nsize, d);
VAR(fsize, f);
실행결과:
[C:TestTest.cpp][20]name=nsize, value=10
[C:TestTest.cpp][21]name=fsize, value=10.000000
그 외 비주얼 C++ 컴파일러가 제공하는 미리 정의된 매크로들이다. 표준은 아니므로 다른 컴파일러에서는 없을 수도 있다.
_DEBUG: 디버그 모드로 컴파일중일 때만 정의된다.
__cplusplus: C++ 모드로 컴파일중일 때만 정의된다.
_DLL: DLL 프로젝트일 때만 정의된다.
_MSC_VER: 비주얼 C++의 컴파일러 버전(6.0은 1200, 7.0(닷넷)은 1300)
_MFC_VER: MFC 라이브러리의 버전값
_ATL_VER: ATL의 버전값
_WIN32: Win32 환경일 때 정의
_WIN64: Win64 환경일 때 정의
_M_ALPHA, _M_IX86, _M_IA64, _M_MPPC: CPU 종류(플랫폼에 따라 약간씩 코드가 달려져야 할 때 이 매크로 사용), 이때 _M_IX86: x86 processors(80386: _M_IX86=300, 80486: 400, Pentium: 500, Pentium Pro: 600)로써 이 값을 이용해서 자신의 프로그램이 동작할 수 있는 CPU의 한계를 제한하는데 이용될 수 있다.
자세한 내용은 여기
Predefined Macros를 잘 참조하세요.
다음으로 #line, #error에 대해서 살펴보자.#line은 __FILE__과 __LINE__을 재설정 하는 preprocess command이다.
#line 1024 "simple21.h"는 다음라인을 __LINE__을 1024, __FILE__을 "simple21.h"로 재설정을 하라는 것이다. #line 1024, #line 1024 "simple21.h"는 모두 정상적으로 동작한다.
보기에서 보면
printf("%d - %s
", __LINE__, __FILE__);
#line 1024 "simple21.h"
printf("%d - %s
", __LINE__, __FILE__);
실행결과
11 - C:TestTest.cpp
1024 - simple21.h
하지만 #line은 언제 사용할지 모르겠지만, 절대 손을 보지 않는 것 좋다.
Visual C++에서 에러를 처리를 할 때 __FILE__과 __LINE__를 이용하는데, 이 값이 재설정 되면 에러 발생 지점을 찾을 수가 없다. 보기에서 살펴보면,
#line 20
k = 10;
의 경우 만일 k의 변수가 미리 선언되어 있지 않다면, 컴파일에서 에러(error C2065: 'k' : undeclared identifier)가 발생을 하는데, 이때 에러위치를 찾아가면 __LINE__에 의해 k=10;이 아닌 전혀 다른 위치를 가리킨다.
만일
#line 20 "simple21.h"
k = 10;
로 컴파일을 하면, output창에 simple21.h(21) : error C2065: 'k' : undeclared identifier의 에러가 발생을 하고, 그 위치를 찾아가려고 더블클릭을 하면,
'C:Testsimple21.h' Cannot open file. File not found.라는 메시지박스가 뜬다. 그러므로 #line을 이용해서 재설정하는 경우는 없기를 바란다.
상사나 괴롭히고 있는 사람이 있다면 #line을 적절히 이용한다면 좋은 결과(^^)를 얻을 수 있을지도…….마지막으로 #error는 Output 창에 무조건 그 메시지를 출력을 하고 error수를 하나 증가시킨다.
보기를 보면
#error You must define SIZE to 100
이란 문장을 소스에 넣고 컴파일을 하면 Output창을 보면
--------------------Configuration: Test - Win32 Release--------------------
Compiling...
Test.cpp
C:TestTest.cpp(10) : fatal error C1189: #error : You must define SIZE to 100
Error executing cl.exe.
Test.exe - 1 error(s), 0 warning(s)
이는 다른 사람에게 소스를 제공할 때 매크로상수의 값의 값, 범위가 잘못 설정을 하는 것에 대해서 error 메시지를 보내는 것으로 효과적으로 이용할 수 있다.
#if (SIZE != 100)
#error You must define SIZE to 100
#endif
다음시간에 바림님이 질문하신 #pragma으로 마지막 preprocess command에 대한 설명을 하도록 하고, 그럼 질문이 있다면 언제든지.