2016-06-24 4 views
-1

그래서 내가 C를 공부하고 전처리에 무엇을 의미합니까 내가이 선언되고있는 곳이 할 인수로 M과 필요하고 왜는 문자 A, M은

#ifndef _dbg_h_ 
#define _dbg_h 

#include<stdio.h> 
#include<errno.h> 
#ifdef NDEBUG 
#define debug(M,...)// I do not know why M is an argument here 
#else 
#define debug(M,...)fprintf(stderr,"DEBUG %s:%d: " M "\n",\ 
_FILE_,_LINE_,##_VA_ARGS_) 
#endif 
#define clean_errno()(errno==0?"None":strerror(errno)) 

#define log_err(M,...)fprintf(stderr,\"[ERROR](%s:%d: errno: %s)" M "\n" 
_FILE_,_LINE_ ,\clean_errno(),##_VA_ARGS_) 
... 
#define check(A,M,...)if(!(A)){\   /*why is A an arg here */ 
    log_err(M,##_VA_ARGS_);errno=0;goto error;} 

통해 온/

초기화
+1

이미 알고있는 것처럼 이러한 인수입니다. 그것들은 함수에 인수처럼 전달됩니다. – tkausl

+0

** ** 특정 ** 문제는 무엇입니까? C 책에서 무엇을 찾지 못했습니까? 또는 온라인 리소스? – Olaf

+1

'int n = 42;'- 문자 n은 C 컴파일러에게 무엇을 의미합니까? – melpomene

답변

2

MA의 이름은 전처리기에 특별한 의미가 없습니다.

M은 예를 들어 debug 매크로의 첫 번째 매개 변수 이름입니다. 이름이 M 인 경우 debug 매크로의 정의에서 발생하면 debug을 호출 할 때 전달 된 첫 번째 인수의 값으로 바뀝니다.

...은 가변 개수의 인수를 사용할 수있는 매크로 인 매크로를 의미합니다.

더 간단한 예 : 호출 MY_MACRO(10)에서

#define MY_MACRO(ARG) (2*(ARG)) 

printf("%d\n", MY_MACRO(10)); 

는 이름 ARG 전체 매크로 호출이 (2*(10))으로 확장하는 원인 10로 대체됩니다. 여분의 괄호는 연산자 우선 순위 문제를 방지하기위한 것입니다.