2013-02-01 4 views
0

J'ai l'utilisation suivante de cas#define dans le corps macro

#define ConstantDouble(T)\ 
T(Alert, c_alert) 

// I want to generate #define macro's dynamically 
#define T(x, y) #define #x y <-- Error 
ConstantDouble(T) 
#undef T 

#define Constant(x) Constants::x ; <-- x is Alert and I want the prev #define to  kick in and convert this to c_alert 

// Want to generate members variables directly 
class Constants 
{ 
    #define T(x, y) static double y; 
    ConstantDouble(T) 
    #undef T 
}; 

Cette une solution palliative pour cela?

je voudrais avoir quelque chose comme ça dans mon nom

Constant("Alert") qui est converti en Constants::c_alert;

+2

Ce n'est pas C, c'est C++! Il y a plusieurs astuces de préprocesseur que vous pouvez faire pour faire des choses comme ça en C (cherchez "xmacros"), mais puisque vous utilisez C++ de toute façon, pourquoi ne pas simplement utiliser des templates? – cha0site

+0

Pourriez-vous donner un exemple avec des modèles? – KodeWarrior

+0

Je pourrais peut-être, mais d'abord j'aurai besoin de vous pour expliquer ce que le but de cette construction entière est. Pourquoi voulez-vous écrire 'Constant (" Alert ")' et obtenir 'c_alert'? – cha0site

Répondre

0

Non, il n'y a pas de solution de contournement. Il y a exactement un passage de préprocesseur.

Comme indiqué dans les commentaires, les modèles C++ sont beaucoup plus faciles. Ils sont compilés par le vrai compilateur, qui supporte une grammaire beaucoup plus complexe, peut faire des maths, et peut faire 255 niveaux d'imbrication.

Questions connexes