У меня было нечто похожее несколько месяцев назад, если вы используете макросы и у вас есть параметры, которые содержат запятые (','), вам нужно заключить их в лишние скобки, например:
#define DEF(ret,conv,name,args) typedef ret (conv * name)(args)
//usage
DEF(void,__cdecl,Foo,(int a1, string a2));
этот метод может конфликтовать с некоторыми вещами / быть недопустимым в некоторых случаях, например, в этом примере (он может стать недопустимым приведением в стиле c):
#define MY_VAR(type,name) type name
//usage
MY_VAR((std::map<std::string, float>),Map);
Существует один способ решения этой проблемы, но он требует, чтобы ваш компилятор поддерживал переменные макросы ( GCC | MSVC ):
#define _W(...) __VA_ARGS__
#define VAR(x,y) x y
VAR(_W(std::map<std::string, float>),Map);