C 언어 표준 라이브러리 입출력 기능의 printf, scanf와, sscanf에서, sprintf와, 이들 파라미터의 표준 라이브러리 sscanf에서 가변적이다. 디버거, 우리는 변수 매개 변수 매크로, 로그를 기록 할 변수 매개 변수 출력 기능을 정의 할 수 있습니다 때 좋은 선택이 될 것입니다.
매크로에 지정된 C99 같은 매개 변수와 함수 등일 수있다 :
#DEFINE의 LOG (형식, ...)는 fprintf (표준 출력, 형식, __VA_ARGS__)
... 가변 인수 목록을 나타내고, __ 전처리에 VA_ARGS__, 그것은 대체 파라미터 (인자리스트)의 실제 집합이다.
동시에 또한 매개 변수 이름을 변경할 수 있습니다 GCC와 방식을 지원에서 (: VC는 지원하지 않습니다)
#DEFINE의 LOG (형식 인수 ...)는 fprintf (표준 출력, 형식, 인수)
마찬가지로, 전처리시 인수는 실제 파라미터 세트에 의해 대체 될 것이다. 사용법은 위와 같은 방법이지만, 매개 변수의 표시가 변경되었습니다.
파라미터 빈으로 전송 될 수 있지만, 두 가지 방법의 가변 파라미터를 생략 할 수 없습니다. 여기서, 연결 사용의 "##"기호를 언급하는 것이 필요하다 "##"의 역할은 "연결의 표시, 위의 예 형식, 인수, 토큰이 비어있는 경우 __ VA_ARGS이 토큰으로 볼 수있다 ## "이 변수 패러미터를 생략하는 것이 허용되며, 접속되지 않는다. 두 실시 예의 변형 :
#DEFINE의 LOG (형식, ...)는 fprintf (표준 출력 형식, ## __ VA_ARGS__) #DEFINE의 LOG (형식 인수 ...)는 fprintf (표준 출력 형식, 인수 ##)
이제 파라미터가 생략 될 수 있음을, 로그 출력 기능을 달성하기 위해 스위치 매크로 정의는 간단하다 :
#ifdef와 디버그 #DEFINE의 LOG (형식, ...)는 fprintf (표준 출력 ">>>>>"포맷 "<<<<"## __ VA_ARGS__) #else #DEFINE의 LOG (형식, ...) #endif 다음
예
사용법 #include " stdio.h에 " #DEFINE LOG_TYPE1 (형식, ...) 할 {\ 의 printf (형식, __VA_ARGS__); \ \ } 동안 ( 0 ) #DEFINE LOG_TYPE2 (형식에 args ...) {\ 수행 의 printf (형식을 인수); \ \ } 동안 ( 0 ) #DEFINE LOG_TYPE3 (형식, ...) {\의 수행 에서 printf (형식 ## __ VA_ARGS__); \ \ } 동안 ( 0 ) #DEFINELOG_TYPE4 (형식 인수 ...) {할 \ 의 printf (형식, ## 인수); \ \ } 동안 ( 0 ) #DEFINE의 LOG (X)의 printf ( "로그"#x를 "가 % d \ 없음"X); INT의 값 = 10 ; INT 주 () { printf와 ( " . 안녕하세요! \ n " ); // LOG_TYPE1 ( "안녕하세요가 % d \ 없음"); 에러 LOG_TYPE1 ( " 안녕하세요가 % d \ 없음을 " , 1 ); // LOG_TYPE2 ( "안녕하세요 \ 없음"); 에러 LOG_TYPE2를 ( " 안녕하세요가 % d \ 없음 " 2 ); LOG_TYPE3 ( " 안녕하세요 3 \ n " ); LOG_TYPE3 ( " 안녕하세요가 % d \ 없음 " , 3 ); LOG_TYPE4 ( " 안녕하세요 4 \ n " ); LOG_TYPE4 ( " 안녕하세요가 % d \ 없음 " , 4 ); LOG ( 10 ); LOG (값); 반환 0 ; }