ошибка: вставка "tmp_UINT" и "+" не дает действительный токен предварительной обработки - PullRequest
0 голосов
/ 18 мая 2018

У меня есть макрос, определенный как:

#define GET_GENERIC_VAL(val_type, fmt_printf, prefix, suffix) \
val_type tmp_ ## val_type; \
rtc = (*(INOBJECT**)pObj)->getGeneric(meth, &(tmp_ ## val_type)); \
if (rtc == -1) { \
    TRACE("Error: unable to get method for " #val_type " attribute " << attribute << " of object " << name); \
    return -1; \
} \
sprintf(valueStr, fmt_printf, (prefix)(tmp_ ## val_type ## suffix));

и вызывающий этот макрос в случае переключателя как:

switch (var_type) {
    case 'u' : { GET_GENERIC_VAL(UINT      ,"%lu",UINT        , + 0        ); break; }
    case 'i' : { GET_GENERIC_VAL(INT       ,"%ld",INT         , + 0        ); break; }
    case 's' : { GET_GENERIC_VAL(STRING    ,"%s" ,const char *, + '\0'     ); break; }
    case 'n' : { GET_GENERIC_VAL(NUMBER    ,"%s" ,const char *, .toString()); break; }
    case 'b' : { GET_GENERIC_VAL(BYTESTRING,"%s" ,const char *, .toString()); break; }
    case 'd' : { GET_GENERIC_VAL(DATE      ,"%s" ,const char *, .toString()); break; }
    case 't' : { GET_GENERIC_VAL(TIME      ,"%s" ,const char *, .toString()); break; }
    default : {
        TRACE("Unknown type of attribute : type '" << var_type << "' for attribute '" << attribute << "' of object " << name << ".");
        return -1;
    }
}

Я пытался скомпилировать это на компиляторе gcc, но компилятор выдает ниже ошибки:

error: pasting "tmp_UINT" and "+" does not give a valid preprocessing token         
error: pasting "tmp_INT" and "+" does not give a valid preprocessing token          
error: pasting "tmp_STRING" and "+" does not give a valid preprocessing token       
error: pasting "tmp_NUMBER" and "." does not give a valid preprocessing token       
error: pasting "tmp_BYTESTRING" and "." does not give a valid preprocessing token   
error: pasting "tmp_DATE" and "." does not give a valid preprocessing token         
error: pasting "tmp_TIME" and "." does not give a valid                             

Может кто-нибудь помочь решить эту проблему?Работало нормально при компиляции на платформе SUN.Но ошибка с Linux.

1 Ответ

0 голосов
/ 18 мая 2018

У вас проблема с неправильным токенизацией:

sprintf(valueStr, fmt_printf, (prefix)(tmp_ ## val_type ## suffix));

При использовании макроса вы не хотите создавать один токен препроцессора, но хотите просто добавить суффикс.

Попробуйтеэто вместо:

sprintf(valueStr, fmt_printf, (prefix)(tmp_ ## val_type  suffix));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...