__DATE__, __TIME__ 은 ANSI/ISO 표준으로 정의되고 C 컴파일러 전처리기가 제공하는 특수한 매크로로 소스파일이 컴파일 시점의 날짜와 시간 정보를 나타내는 문자열 리터럴이다.
보통 __TIME__ 의 경우는 우리가 자주 사용하는 형태와 동일하기 때문에 따로 손댈게 없다.
하지만 __DATE__ 의 경우 월, 일, 년도 순이고 월은 영문에 일은 한자리 수 인경우 앞이 공백이여서 그대로 쓰기엔 애매하다.
따라서 __DATE__를 원하는 형태의 formatted string으로 출력하기 위해 다음의 두가지 방법이 있다.
첫번째 방법
yyyy-mm-dd 로 출력하고자 하는 경우 해당 digit Character를 추출해서 조합하는 형태
#include <stdio.h>
#define BUILD_YEAR_CH0 (__DATE__[ 7])
#define BUILD_YEAR_CH1 (__DATE__[ 8])
#define BUILD_YEAR_CH2 (__DATE__[ 9])
#define BUILD_YEAR_CH3 (__DATE__[10])
#define BUILD_MONTH_IS_JAN (__DATE__[0] == 'J' && __DATE__[1] == 'a' && __DATE__[2] == 'n')
#define BUILD_MONTH_IS_FEB (__DATE__[0] == 'F')
#define BUILD_MONTH_IS_MAR (__DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'r')
#define BUILD_MONTH_IS_APR (__DATE__[0] == 'A' && __DATE__[1] == 'p')
#define BUILD_MONTH_IS_MAY (__DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'y')
#define BUILD_MONTH_IS_JUN (__DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'n')
#define BUILD_MONTH_IS_JUL (__DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'l')
#define BUILD_MONTH_IS_AUG (__DATE__[0] == 'A' && __DATE__[1] == 'u')
#define BUILD_MONTH_IS_SEP (__DATE__[0] == 'S')
#define BUILD_MONTH_IS_OCT (__DATE__[0] == 'O')
#define BUILD_MONTH_IS_NOV (__DATE__[0] == 'N')
#define BUILD_MONTH_IS_DEC (__DATE__[0] == 'D')
#define BUILD_MONTH_CH0 ((BUILD_MONTH_IS_OCT || BUILD_MONTH_IS_NOV || BUILD_MONTH_IS_DEC) ? '1' : '0')
#define BUILD_MONTH_CH1 ((BUILD_MONTH_IS_JAN || BUILD_MONTH_IS_NOV) ? '1' : \
(BUILD_MONTH_IS_FEB || BUILD_MONTH_IS_DEC) ? '2' : \
(BUILD_MONTH_IS_MAR) ? '3' : \
(BUILD_MONTH_IS_APR) ? '4' : \
(BUILD_MONTH_IS_MAY) ? '5' : \
(BUILD_MONTH_IS_JUN) ? '6' : \
(BUILD_MONTH_IS_JUL) ? '7' : \
(BUILD_MONTH_IS_AUG) ? '8' : \
(BUILD_MONTH_IS_SEP) ? '9' : \
(BUILD_MONTH_IS_OCT) ? '0' : '?')
#define BUILD_DAY_CH0 ((__DATE__[4] >= '0') ? (__DATE__[4]) : '0')
#define BUILD_DAY_CH1 (__DATE__[ 5])
const char compiledDate[] = { BUILD_YEAR_CH0, BUILD_YEAR_CH1, BUILD_YEAR_CH2, BUILD_YEAR_CH3, '-',
BUILD_MONTH_CH0, BUILD_MONTH_CH1, '-',
BUILD_DAY_CH0, BUILD_DAY_CH1 };
int main(void) {
printf("Compiled Date: %s\n", compiledDate);
return 0;
}
두번째 방법
년, 월, 일을 정수형태로 얻어내고 printf의 서식지정자를 통해 원하는 형태로 출력하는 형태
#include <stdio.h>
#define BUILD_YEAR (__DATE__[7] - '0') * 1000 + (__DATE__[8] - '0') * 100 + (__DATE__[9] - '0') * 10 + (__DATE__[10] - '0')
#define BUILD_MONTH (__DATE__[0] == 'J') ? ((__DATE__[1] == 'a') ? 1 : ((__DATE__[2] == 'n') ? 6 : 7)) \
: (__DATE__[0] == 'F') ? 2 \
: (__DATE__[0] == 'M') ? ((__DATE__[2] == 'r') ? 3 : 5) \
: (__DATE__[0] == 'A') ? ((__DATE__[1] == 'p') ? 4 : 8) \
: (__DATE__[0] == 'S') ? 9 \
: (__DATE__[0] == 'O') ? 10 \
: (__DATE__[0] == 'N') ? 11 \
: (__DATE__[0] == 'D') ? 12 : 0
#define BUILD_DAY (__DATE__[4] == ' ') ? (__DATE__[5] - '0') : ((__DATE__[4] - '0') * 10 + (__DATE__[5] - '0'))
int main(void) {
printf("Compiled Date: %04d-%02d-%02d\n", BUILD_YEAR, BUILD_MONTH, BUILD_DAY);
return 0;
}
참고 :
https://stackoverflow.com/questions/17739390/different-format-of-date-macro
https://www.ibm.com/docs/ko/i/7.5?topic=macros-ansiiso-standard-predefined
'프로그래밍 > C' 카테고리의 다른 글
POSIX thread, mutex 사용법 (0) | 2024.06.26 |
---|---|
C] epoll 사용법 (0) | 2024.06.24 |
C언어 ] qsort (Quick Sort, 퀵정렬) 함수 사용법 (0) | 2024.01.30 |
윈도우 소켓 ] connect() 함수의 타임아웃은 21초 (0) | 2023.12.25 |
윈도우 소켓 ] blocking / non-blocking 소켓 사용 시 소켓함수의 리턴 조건 (0) | 2023.12.24 |