각괄호도 나타낸다 (또는 발생) 할 수 있기 때문에, 비교 연산자 <
, >
, <=
및 >=
는 괄호하는 것처럼, 매크로 확장 각괄호 내부 쉼표를 무시할 수 없다. (대괄호와 중괄호는 일반적으로 균형 잡힌 쌍으로 발생하지만 이는 또한 문제입니다.) 매크로 인수를 괄호로 묶을 수 있습니다.
FOO((std::map<int, int>), map_var);
문제는 매개 변수가 매크로 확장 내에서 괄호로 묶여있어 대부분의 컨텍스트에서 유형으로 읽히지 못하게한다는 것입니다.
이 문제를 해결하는 좋은 방법은 C ++에서 함수 유형을 사용하여 괄호로 묶인 유형 이름에서 유형 이름을 추출 할 수 있다는 것입니다.
template<typename T> struct argument_type;
template<typename T, typename U> struct argument_type<T(U)> { typedef U type; };
#define FOO(t,name) argument_type<void(t)>::type name
FOO((std::map<int, int>), map_var);
함수 유형을 형성하면 추가 괄호를 무시하므로 유형 이름에 쉼표가 포함되지 않은 괄호를 포함하거나 포함하지 않고이 매크로를 사용할 수 있습니다.
FOO((int), int_var);
FOO(int, int_var2);
물론 C에서는 유형 이름이 괄호 밖에 쉼표를 포함 할 수 없기 때문에 이것이 필요하지 않습니다. 따라서 다국어 매크로의 경우 다음과 같이 작성할 수 있습니다.
#ifdef __cplusplus__
template<typename T> struct argument_type;
template<typename T, typename U> struct argument_type<T(U)> { typedef U type; };
#define FOO(t,name) argument_type<void(t)>::type name
#else
#define FOO(t,name) t name
#endif