__VA_ARGS__ 사용하는 C 언어가 매개 변수를 변화 정의합니다 수 (rpm)

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 ; 
}

 

추천

출처www.cnblogs.com/ptfe/p/11223164.html