C 언어 파일 이름, 줄 번호, 함수 이름 방법

I. 서론

이 프로그램은 배경 문제에 대한 상세한 로그를 볼 필요가 실행 C 언어는 트리거 포인트 로그 파일 이름, 행 번호, 메소드의 함수 이름을 제공하고, 키는 새로운 C99 전처리 식별자를 활용하는 것입니다 __VA_ARGS__, 자신을 다음과 내장 매크로 정의 컴파일러, 매크로 정의뿐만 아니라 우리에게 크로스 플랫폼으로 작성된 소스 코드를 도와 유연한 사용이 미묘하게 우리를 도울 수 출력은 디버깅 정보를 매우 유용합니다.

두, ANSI C 표준 매크로

__LINE__     // 현재 소스 코드 라인 수의 소스 코드에 삽입 
__FILE__     // 소스 파일에서 현재 소스 파일의 이름을 삽입 
__DATE__     // 컴파일 소스 파일에 현재 날짜 삽입 
__TIME__은     // 소스 파일을 컴파일하는 현재 시간 삽입 
__STDC__를     / / 프로그램은 ANSI C 표준 식별자 엄격한 준수를 요구 한 할당 될 때 
__cplusplus를 // 당신은 C ++ 프로그램을 작성할 때이 식별자가 정의 

_WIN32은       // 비트 1의 Windows 시스템에 정의되어 실행 
리눅스        // 프로그램이 리눅스에서 실행됩니다 비트 (1)가 시스템에 정의되어 
__x86_64__   // 1 개 같이 프로그램이 정의되는 64 비트 시스템에서 실행 
__i386__     // 프로그램이 1로 정의되는 32 비트 시스템에서 실행되고 

있는 __VA_ARGS__ //이 매크로 가변 파라미터 인 매크로가 될 수있다 새로운 C99는 새로운 사양입니다
             //그것은 현재 GCC와 VC6.0 후 (VC6.0 컴파일러는 지원하지 않습니다) 지원 보인다.
            // 매크로 역할이 ## 앞에, 당신은 0 개 이상의 매개 변수를 받아 들일 수

셋째, 예

매크로 예 :

#INCLUDE <STDIO.H> INT 의 main () 
{ 
    의 printf ( " __func __ % S \ 없음 " , __func__); 
    의 printf ( " __FILE __ %의 S \ 없음 " , __FILE__); 
    의 printf ( " __DATE __ %의 S \ 없음 " , __DATE__); 
    의 printf ( " __TIME __ %의 S \ 없음 " , __TIME__); 
    의 printf ( " __LINE __ %의 D \ 없음 " , __LINE__); 반환 0 ; 
}



     

매크로 프로그램 출력의 예는 다음과 같다 :

__func __ 주된 
__FILE __ : main.c에의 
__DATE __ : 구월 14  2019 
__TIME__ : 14 : 26 : 36 
__LINE__ : 9

네, #의 ##, 및 연산자

#와 ## 연산자는 몇 가지 소개를 할도 여기에 다른 기능을 가지고 있지만, 어디

문자열로 변환 파라미터 1

예 1 :

#DEFINE P (A)의 printf ( "% S % D \ 없음"의 # A, A);
INT 의 main () 
{ 
    INT에서 A = 1 , B = 2 ; 
    아빠); 
    P (b); 
    P (a + b); 
    
    반환  0 ; 
}

실시 예 1은 다음 절차를 출력한다 :

A : 1 
, B : 2 + B : 3

예 2 :

#DEFINE SQUARE (X)의 printf (#x를 "의 제곱은" "% d 개의 \ n."((X) * (X)))
 INT 의 main () 
{ 
    SQUARE ( 8 ); 
    
    반환  0 ; 
}

실시 예 2 다음 절차 출력 :

제곱 8   64

2. 매크로 기능의 일부를 대체하기 위해 사용될 수있는 ## 운영자

#DEFINE XName이 (N-) N-X ## // 매크로이 사용하는 경우 : (. 8) XName이이
 // 같은 방법으로 배포됩니다 : X8

## 즉, 이전에 상기 두 부분은 함께 결합 된 후, 의미의 "문자"감압 성 접착제이다. 그러나 "##"모든 문자를 결합하는 자유에 유효한 C 언어 식별자 여야 없습니다. 단일 매크로 정의 대부분에서 "#"또는 "##"전처리 조작이 발생할 수있다. 은 "#"또는 "##"전처리 관련 작업자가 순서가 계산 지정하지 않을 경우 문제가 발생할 수 있습니다. 이 문제는, 하나의 매크로 정의 하나만 운영자 (즉, "#"또는 "##", 또는하지 않음)의 사용을 방지한다. 이 필요한, 또는하지 않는 한 "#"을 사용하지 않으려 고 "##을."

__VA_ARGS__ 변수 매개 변수 매크로입니다, 몇 사람이 매크로를 알고, 매크로 변수 매개 변수는 새 C99의 새로운 규범, 지금은 단지이 (VC6.0 컴파일러는 지원하지 않습니다) GCC를 지원하는 것으로 보인다. 마지막 아이디어는 줄임표 (즉, 세 점)의 매개 변수 목록에 정의 된 매크로 매개 변수를 달성하는 것입니다.

## __ VA_ARGS__ 매크로 역할은 가변 파라미터의 수가 0, 과잉 플레이 ","효과를 제거하거나 컴파일 오류 전면 ## 인 ##에 의해 선행되고 ## __ VA_ARGS__ 예 :

#DEFINE의 my_print1 (FMT, ...)에의 printf (FMT, __VA_ARGS__에서) 
my_print1 ( " iiijjj \ N- " )         // 오류 인쇄 
my_print1 ( " I = % D, D J = % \ N- " , I, J) // 제대로 인쇄 

#DEFINE my_print2 (FMT, ...)의 printf (FMT를 ## __ VA_ARGS__) 
my_print2 ( " iiijjj \ N- 형 " )         // 인쇄 올바르게 
my_print2 ( " I = %의 D, J = % D \ N- 형 " , I, J) // 인쇄 올바르게

 

추천

출처www.cnblogs.com/macrored/p/11519145.html