2012-09-15 4 views
9
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "native-activity", __VA_ARGS__)) 
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "native-activity", __VA_ARGS__)) 

이것은 두 매크로에 대한 정의입니다. 나중에 코드에서 LOGILOGWC에서 세 개의 점이있는 #define

LOGW("Unable to eglMakeCurrent"); 

나는 복잡한 매크로와 일반 #define을 피하려고하기 때문에, 내가 얻을 수있는이 방법

LOGI("accelerometer: x=%f y=%f z=%f", 
           event.acceleration.x, event.acceleration.y, 
           event.acceleration.z); 

이 방법을 사용하는 것이 매크로 실제로 수단 . 여기에 3 점 표기법의 역할은 무엇입니까? 나중에 #define이 코드에서 변경됩니까?

은 분명히 나는 ​​3 점 표시 및 인수의 무한한 양하는 데 사용되는 것을 알고,하지만 난이 상황을 읽는 방법을 모르겠어요.

+4

가변 매크로라고합니다. http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html – chris

+0

@chris 그래서 좀 덜 장황하고 어떤 방식으로 논쟁을 재 배열하려고 노력하는 방법입니까? – Ken

+0

흠, 나는'## __ VA_ARGS__'을 사용했을 것입니다. 그러나 여러분이 인자를 주어야만 괜찮습니다. – nneonneo

답변

14

C99 표준은 가변 개수의 가변 인수를 취할 수있는 함수 유사 매크로 인 가변 매크로 인 을 도입했습니다.

매크로 정의 식별자리스트가 생략로 끝나지 않으면 해당 아규먼트 인수의 수 ( 이루어지는 :

C 표준, 섹션 6.10.3의 latest draft를 인용 함수와 같은 매크로를 호출 없음 전처리 토큰)의 매크로 정의 파라미터의 수와 일치한다. 그렇지 않으면합니다 (... 제외) 매크로 정의에 매개 변수가보다 호출 에서 더 많은 인수가 있어야한다. 는 호출을 종료 a) 전처리 토큰이 존재한다.

식별자 __VA_ARGS__은 매개 변수의 줄임표 표기법을 사용하는 함수와 비슷한 매크로 인 의 대체 목록에서만 발생합니다.

... 매크로 정의 식별자리스트에 ... 있으면

어떠한 분리 콤마 전처리 토큰 포함 후미 인수는 하나를 형성하도록 병합 항목 : 변수 인수. 이렇게 결합 된 인수의 수 이 합병 인수의 수 (... 제외) 매크로 정의 파라미터의 개수보다 하나 이상이며,되도록한다.

, 다음 항에

는 : 파라 것처럼

교체리스트에 발생하는 식별자 __VA_ARGS__ 처리 하며, 가변 인수 사용 전처리 토큰을 형성한다 그것을 대체하십시오.

그래서 당신이 원하는대로 당신은 많은 인수 LOGI 또는 LOGW를 호출 할 수 있습니다, 그들은 모든 __VA_ARGS__에 대한 참조에 의해 정의에 지정된 장소에서 확장됩니다.

+0

그건 그렇고, 표준에 의해 허용 된'## __ VA_ARGS__' (일반적으로 가변 인수 매크로에 제공된 제로 인수의 경우를 처리하는 데 사용됩니까? 그것은 필요한가요? – nneonneo

+0

'## __ VA_ARGS__' 표기법은 GCC 확장입니다. –

+0

예, 확장이며 매크로가받는 인수의 수를 계산하는 다른 기술로 대체 될 수 있습니다. –