Sembra che si stia tentando di definire uno enum Error
che abbia anche le stringhe come membri. Ti darò la mia soluzione a questo problema. (Non sto affrontando la domanda ma credo che la mia risposta sia rilevante per quello che capisco che OP sta cercando di fare.)
E ho appena realizzato che l'OP ha come target C, non C++, quindi non so se questo si può fare ...
in MyEnum.hpp
#define MYENUM(X,...) \
struct X { \
enum Enum {__VA_ARGS__}; \
static const std::vector<std::string> names; \
static X::Enum which(const std::string& s) { \
return static_cast<X::Enum>(findEnum(s,names)); \
} \
static std::string str(X::Enum i) { \
return names[i];} \
}
Qui findEnum()
è solo una ricerca lineare sopra il vettore che restituisce l'indice di posizione (in aggiunta, nella mia implementazione se non lo trova viene generata eccezione con tutti gli input corretti possibili, faccio anche il confronto case sensitive). Si noti che una mappa ordinata invece di un vettore sarebbe più efficiente (O (log (n)) invece di O (n)), ma non mi è importato molto perché la dimensione di queste cose è molto piccola nel mio caso.
Sotto la macro precedente, dichiara il tuo enum come
MYENUM(Error,Connect,Timeout); // I put the semicolon here not in the macro
E in MyEnum.cpp
, aggiungere
#include <boost/assign/list_of.hpp>
const std::vector<std::string> Error::names = boost::assign::list_of
("Connect")("Timeout");
(penso che dovrebbe essere possibile utilizzare gli elenchi di inizializzazione con un compilatore moderno).La cosa importante qui è assicurarsi che l'ordine sia lo stesso, altrimenti non funzionerà.
Poi, si può fare cose come questa:
Error::Enum err1 = Error::Connect;
Error::Enum err2 = Error::which("Timeout");
std::cout << "Got " << Error::str(err1) << " error. Not good.\n";
potrebbe essere in grado di raggiungere questo obiettivo, ma sarà così contorto io non lo consiglio. Qual è il tuo obiettivo più grande? Perché lo vuoi? Sembra un [XY Problem] (http://meta.stackexchange.com/a/66378). – tenfour
Credo che ciò che si sta tentando di fare non possa essere raggiunto con i macro. – Codor
Utilizzare [XMacro] (http://en.wikipedia.org/wiki/X_Macro) –