Нужно исправить мои Variadic Macros

Я хочу использовать переменные макросы, но я получаю ошибки

#define SERVER_RE_1(ServerFunction, Type1)                          \
{                                                               \
Type1 arg1;                                                 \
getData(args, arg1);                                        \
sv. ## ServerFunction ## (ssl, arg1);                       \
}

#define SERVER_RE_2(ServerFunction, Type1, Type2)                   \
{                                                               \
Type1 arg1;                                                 \
Type2 arg2;                                                 \
getData(args, arg1, arg2);                                  \
sv. ## ServerFunction ## (ssl, arg1, arg2);                 \
}

#define SERVER_RE_3(ServerFunction, Type1, Type2, Type3)            \
{                                                               \
Type1 arg1;                                                 \
Type2 arg2;                                                 \
Type3 arg3;                                                 \
getData(args, arg1, arg2, arg3);                            \
sv. ## ServerFunction ## (ssl, arg1, arg2, arg3);           \
}

#define GET_MACRO(_1,_2,_3,_4,NAME,...) NAME
#define SERVER_RE(...) GET_MACRO(__VA_ARGS__, SERVER_RE_3, SERVER_RE_2, SERVER_RE_1)(__VA_ARGS__)

SERVER_RE(signIn, std::string, std::string);

ошибка C2065: ‘signIn’: необъявленный идентификатор
ошибка C2275: ‘std :: string’: недопустимое использование этого типа в качестве выражения

Но SERVER_RE_2 работает хорошо.

SERVER_RE2(signIn, std::string, std::string);

0

Решение

Удалить лишний ##как в замене строк

    sv. ## ServerFunction ## (ssl, arg1, arg2, arg3);           \

с

    sv. ServerFunction (ssl, arg1, arg2, arg3);           \

РЕДАКТИРОВАТЬ

Можете ли вы попробовать скомпилировать следующий код?

#include <string>
#define SERVER_RE_1(ServerFunction, Type1)                          \
{                                                               \
Type1 arg1;                                                 \
getData(args, arg1);                                        \
sv. ServerFunction (ssl, arg1);                       \
}

#define SERVER_RE_2(ServerFunction, Type1, Type2)                   \
{                                                               \
Type1 arg1;                                                 \
Type2 arg2;                                                 \
getData(args, arg1, arg2);                                  \
sv.ServerFunction(ssl, arg1, arg2);                 \
}

#define SERVER_RE_3(ServerFunction, Type1, Type2, Type3)            \
{                                                               \
Type1 arg1;                                                 \
Type2 arg2;                                                 \
Type3 arg3;                                                 \
getData(args, arg1, arg2, arg3);                            \
sv.ServerFunction(ssl, arg1, arg2, arg3);           \
}

#define GET_MACRO(_1,_2,_3,_4,NAME,...) NAME
#define SERVER_RE(...) GET_MACRO(__VA_ARGS__, SERVER_RE_3, SERVER_RE_2, SERVER_RE_1)(__VA_ARGS__)

struct C{
template<class T1>
void signIn(int,T1){}
template<class T1, class T2>
void signIn(int,T1,T2){}
template<class T1, class T2,class T3>
void signIn(int,T1,T2,T3){}
};

template<class T1>
void getData(int,T1){}
template<class T1, class T2>
void getData(int,T1,T2){}
template<class T1, class T2, class T3>
void getData(int,T1,T2,T3){}

int main(){
C sv;
int args=0,ssl=0;
SERVER_RE(signIn, std::string);
SERVER_RE(signIn, std::string, std::string);
SERVER_RE(signIn, std::string, std::string, std::string);
}

Это полный код, который компилируется — как есть — для меня в обоих g++ а также clang++, в обоих c++11 а также c++98 режимы

Редактировать 2

Это первое предупреждение warning C4003 заставляет меня думать, что здесь есть основная проблема с переменными макросами.

Действительно, при загрузке моих окон и игре в визуальной студии в визуальной студии есть ошибка в расширении макроса с переменным числом аргументов.

Вы можете увидеть это сами с помощью следующего кода:

#include <stdio.h>
#define AAA(a,b) printf("%d %d\n",a,b)
#define BBB(...) AAA(__VA_ARGS__)
int main(){
AAA(1,2); // works
BBB(3,4); // warning + error
}

Но не беспокойся! Вы можете это исправить! Используйте мой код выше, но замените строку

#define SERVER_RE(...) GET_MACRO(__VA_ARGS__, SERVER_RE_3, SERVER_RE_2, SERVER_RE_1)(__VA_ARGS__)

с

#define GET_MACRO_X(X) GET_MACRO X
#define SERVER_RE(...) GET_MACRO_X((__VA_ARGS__, SERVER_RE_3, SERVER_RE_2, SERVER_RE_1))(__VA_ARGS__)

и это компилируется в визуальной студии! УРА!

2

Другие решения


По вопросам рекламы [email protected]