Макрос препроцессора не работает

У меня проблема с получением этого макроса COMPARE для работы. Есть идеи как починить?

Это немного искусственный образец — я хотел сделать его как можно меньше.

#include <iostream>
#include <string.h>

enum rqtypes {Unknown, Monitor, Query, Snapshot };

class base {
public:
base() : type(Unknown) {}
rqtypes type;
};

class CBMonitorDeviceRequest : public base
{
public:
CBMonitorDeviceRequest() : dn(0) {}
char* dn;
};//I want the equivalent of:
//        case MonitorDeviceRequestID:
//           CBMonitorDeviceRequest* pthis = static_cast<CBMonitorDeviceRequest*>(thisrq);
//           if(pthis && strcmp(pthis->dn1, "1234") == 0)
//              return 0;
//           else
//              return -1;
//           break;int main(int argc, char* argv[])
{
CBMonitorDeviceRequest* ptr = new CBMonitorDeviceRequest;
ptr->type = Monitor;
ptr->dn = new char(strlen("1234") + 1);
strcpy(ptr->dn, "1234");

#define COMPARE(id, thismsg) case id##ID: { \
CB##id * pthis = static_cast<CB##id *>(thismsg); \
if(pthis && strcmp(pthis->dn, "1234") == 0) \
std::cout << "found"; \
else \
std::cout << "not found"; \
break;  } \

switch(ptr->type){
COMPARE(Monitor, ptr);
}

#undef COMPARE

return 0;
}

Я получаю, например:

(46) : error C2065: 'MonitorID' : undeclared identifier
(46) : error C2051: case expression not constant
(46) : error C2065: 'CBMonitor' : undeclared identifier
(46) : error C2065: 'pthis' : undeclared identifier
(46) : error C2061: syntax error : identifier 'CBMonitor'
(46) : error C2065: 'pthis' : undeclared identifier
(46) : error C2065: 'pthis' : undeclared identifier
(46) : error C2227: left of '->dn' must point to class/struct/union/generic type

Используя gcc -E, я получаю:
# 30 «macro_fun2.cpp» int main (int argc, char * argv [])
{
CBMonitorDeviceRequest * ptr = new CBMonitorDeviceRequest;
ptr-> type = Monitor;
ptr-> dn = новый символ (strlen («1234») + 1);
strcpy (ptr-> dn, «1234»);
# 45 Переключатель «macro_fun2.cpp» (ptr-> type) {
case MonitorID: {CBMonitor * pthis = static_cast (ptr); если (pthis && strcmp (pthis-> dn, «1234») == 0) Monitor = Query; иначе монитор = снимок;
перерыв; };
}

вернуть 0;
}

*** By the way I changed code to to avoid the massive printing of iostream by preprocessor - otherwise -E printing would have been huge.

#define COMPARE(id, thismsg) case id##ID: { \
CB##id * pthis = static_cast<CB##id *>(thismsg); \
if(pthis && strcmp(pthis->dn, "1234") == 0) \
id = Query; \
else \
id =  Snapshot; \
break;  } \

0

Решение

id##ID будет расширяться до MonitorID, который не определен. Вы либо хотите переименовать Monitor в MonitorID в определении rqtypesили измените это просто id,

CB##id будет расширяться до CBMonitor, который также не определен. Вы либо хотите переименовать class CBMonitorDeviceRequest в class CBMonitorили измените это на CB##id##DeviceRequest,

Кроме того, я не вижу никаких очевидных проблем. Помимо утечки памяти, конечно. Почему вы не используете std::string для ваших строк?

0

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

Я думаю ты хочешь CB##idне CBid##,

1