0

この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 -EI getの使用:#30 "macro_fun2.cpp" int main(int argc、char * argv []){CBMonitorDeviceRequest * ptr = new CBMonitorDeviceRequest; ptr->type=モニター; ptr-> dn = new char(strlen( "1234")+ 1); strcpy(ptr-> dn、 "1234"); #45 "macro_fun2.cpp" switch(ptr-> type){case MonitorID:{CBMonitor * pthis = static_cast(ptr); if(pthis && strcmp(pthis-> dn、 "1234")== 0)モニター=クエリ; elseMonitor=スナップショット; 壊す; }; }

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;  } \
4

2 に答える 2

1

CB##idではなく、欲しいと思いますCBid##

于 2012-09-28T15:27:04.367 に答える
0

id##IDに展開されMonitorIDますが、これは定義されていません。の定義で名前Monitorをに変更するか、これを単に に変更します。MonitorIDrqtypesid

CB##idに展開されCBMonitorますが、これも定義されていません。名前を に変更するかclass CBMonitorDeviceRequestclass CBMonitorこれを に変更しCB##id##DeviceRequestます。

それとは別に、明らかな問題は見られません。もちろん、メモリリークは別として。なぜstd::string弦に使わないのですか?

于 2012-09-28T15:34:07.917 に答える