2012-12-21 5 views
0

본질적으로 매크로 쇼트 너를 갖고 싶습니다.매크로에서 가변 인수를 확장하는 방법은 무엇입니까?

매크로 FOO(A,B,C)defined(_FOO_A) || defined(_FOO_B) || defined(_FOO_C)으로 확장되어야합니다.

는 GCC의 수는 가변 인자 매크로 인수를 사용하여 실제로 3 개 기능 ( FOO(A), FOO(A,B), FOO(A,B,C))을 작성하지 않는 것이 있습니까?

+3

두 개의 밑줄 또는 하나의 밑줄과 대문자로 시작하는 식별자는 l 고뇌 구현. –

+0

일반적으로, 인수를 거치고 정의 된 각각을 검사하는 루프를 작성한다고 할 수 있습니다. 그러나 정의 된 경우 사전 처리기 지시문의 컨텍스트에서 사용하면됩니다. – RonaldBarzell

+0

당신이 제공 한 코드는 일반적인 경우에 원하는 것의 예이거나 그 매크로가 정확히 필요합니까? – effeffe

답변

3

defined 키워드 포함 뭔가 확장 매크로 가질 수 없습니다 : 토큰 defined이 교체 과정 또는 defined 단항 연산자의 사용의 결과로 생성 된 경우

을한다 매크로 바꾸기 전에 두 개의 지정된 양식 중 하나와 일치하지 않는 경우 동작은 입니다.

따라서 defined으로는 수행 할 수 없습니다. FOO_A_, FOO_B_ 값을 테스트하여 제약 조건을 완화하려는 경우 ... P99을 사용하여이 작업을 수행하는 방법이 있습니다. 예컨대 그냥 P99_ORS 표현

((((A) || (B))) || (C)) 

로 확장 한 후 #if 발현에 대해 평가되는 경우 논리적 또는 변수의 목록이

#if P99_ORS(A, B, C) 
... 
#endif 

을 것하고.

또한

CONDITION(A, B, C, toto); 

으로 확장 할

#define P00_NAME_X(NAME, X, I) P99_PASTE2(NAME, X) 
#define CONDITION(NAME, ...) P99_ORS(P99_FOR(FOO_, P99_NARG(__VA_ARGS__), P00_SEQ, P00_NAME_X, __VA_ARGS__)) 

같은 몇 가지 매크로 프로그래밍을 수행하려는 경우, 먼저대로의 표시 목록에 그것을 확장 할 수있는 방법이있을 것

((((((FOO_A) || (FOO_B))) || (FOO_C))) || (FOO_toto)); 
2

이와 비슷한?

#include <stdio.h> 

#define FOO(A, B, C) (FOO_X(A) || FOO_X(B) || FOO_X(C)) 
#define FOO_X(x) defined(_FOO_##x) 

// just to print it 
#define QUOTE(...) QUOTE_AUX(__VA_ARGS__) 
#define QUOTE_AUX(...) #__VA_ARGS__ 

int main(void) 
{ 
    puts(QUOTE(FOO(a, b, c))); 
} 

편집 : 사실이 모든 C 표준에 정의되지 않은 동작 결과.

+2

불행히도 이것은 표준에 의해 금지되어 있습니다.'define'은 매크로 확장에 나타나지 않습니다. –

+0

맞아, 내가 대답에 추가 할께. 고마워. +1 – effeffe