미리 정의된 매크로
미리 정의된 매크로(predefined macro)
C언어에서는 컴파일러가 참고해야 할 정보를 알려주기 위해서 몇몇 매크로를 미리 정의하여 제공하고 있습니다.
미리 정의된 매크로는 #define 선행처리 지시자로 정의하지 않아도 사용할 수 있으나, 사용자가 재정의할 수는 없습니다.
C언어에서 제공하는 미리 정의된 매크로는 다음과 같습니다.
미리 정의된 매크로 | 설명 |
---|---|
__DATE__ | 선행처리가 수행된 날짜를 "Mmm dd yyyy"형식으로 나타낸 문자열 |
__TIME__ | 선행처리가 수행된 시간을 "hh:mm:ss"형식으로 나타낸 문자열 |
__FILE__ | 현재 소스 파일의 이름을 나타내는 문자열 |
__LINE__ | 현재 소스 파일에서 처리중인 라인 번호를 나타내는 문자열 |
__STDC__ | 컴파일러가 C언어 표준을 따르면 1로 설정함. |
__STDC_HOSTED__ | 호스트 환경이 아니면 0, 호스트 환경이면 1로 설정함. |
예제
#include <stdio.h>
int main(void)
{
printf("선행처리가 수행된 날짜는 %s입니다.\n", __DATE__);
printf("선행처리가 수행된 시간은 %s입니다.\n", __TIME__);
printf("현재 소스 파일에서 처리중인 라인 번호는 %d입니다.\n", __LINE__);
printf("__STDC__ : %d\n", __STDC__);
printf("__STDC_HOSTED__ : %d\n", __STDC_HOSTED__);
return 0;
}
실행 결과
선행처리가 수행된 날짜는 Feb 15 2017입니다.
선행처리가 수행된 시간은 17:03:55입니다.
현재 소스 파일에서 처리중인 라인 번호는 7입니다.
__STDC__ : 1
__STDC_HOSTED__ : 1
#line
#line 선행처리 지시자는 __LINE__ 매크로와 __FILE__ 매크로를 재정의할 수 있게 해줍니다.
라인 번호는 int형 타입으로, 파일명은 문자열로 전달됩니다.
이 선행처리 지시자는 사용자가 직접 사용하기보다는 주로 컴파일러가 오류 메시지를 위해 사용합니다.
#error
#error 선행처리 지시자는 지정한 오류 메시지를 출력하고, 컴파일 과정을 중단시킵니다.
주로 조건부 컴파일 선행처리 지시자와 함께 사용하여 디버깅에 사용됩니다.
#undef
#undef 선행처리 지시자는 #define 선행처리 지시지와 정확히 반대되는 동작을 수행합니다.
즉, 이미 정의되어 있는 매크로를 취소하는 동작을 수행합니다.
따라서 #define 선행처리 지시자에 의해 정의되는 매크로가 치환하는 범위는 #define 지시자가 정의된 위치부터 #undef 지시자에 의해 취소되는 위치나 파일의 끝까지가 됩니다.
단, 위에서 살펴본 미리 정의된 매크로는 사용자가 임의로 정의를 취소할 수 없습니다.