본질적으로 매크로 쇼트 너를 갖고 싶습니다.매크로에서 가변 인수를 확장하는 방법은 무엇입니까?
매크로 FOO(A,B,C)
은 defined(_FOO_A) || defined(_FOO_B) || defined(_FOO_C)
으로 확장되어야합니다.
FOO(A)
,
FOO(A,B)
,
FOO(A,B,C)
)을 작성하지 않는 것이 있습니까?
본질적으로 매크로 쇼트 너를 갖고 싶습니다.매크로에서 가변 인수를 확장하는 방법은 무엇입니까?
매크로 FOO(A,B,C)
은 defined(_FOO_A) || defined(_FOO_B) || defined(_FOO_C)
으로 확장되어야합니다.
FOO(A)
,
FOO(A,B)
,
FOO(A,B,C)
)을 작성하지 않는 것이 있습니까?
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));
이와 비슷한?
#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 표준에 정의되지 않은 동작 결과.
불행히도 이것은 표준에 의해 금지되어 있습니다.'define'은 매크로 확장에 나타나지 않습니다. –
맞아, 내가 대답에 추가 할께. 고마워. +1 – effeffe
두 개의 밑줄 또는 하나의 밑줄과 대문자로 시작하는 식별자는 l 고뇌 구현. –
일반적으로, 인수를 거치고 정의 된 각각을 검사하는 루프를 작성한다고 할 수 있습니다. 그러나 정의 된 경우 사전 처리기 지시문의 컨텍스트에서 사용하면됩니다. – RonaldBarzell
당신이 제공 한 코드는 일반적인 경우에 원하는 것의 예이거나 그 매크로가 정확히 필요합니까? – effeffe