2010-10-15 14 views
6

estoy usando macros del preprocesador para declarar algunas variables repetitivas, específicamente:C++ macro - capitalizar cadena

QuitCallbackType quitCallback; 
LossCallbackType lossCallback; 
PauseCallbackType pauseCallback; 
KeyCallbackType keyCallback; 
MouseCallbackType mouseCallback;

me gustaría usar una macro preprocesador para hacerlo, a la


CREATE_CALLBACK_STORAGE(quit) 
CREATE_CALLBACK_STORAGE(loss) 
CREATE_CALLBACK_STORAGE(pause) 
CREATE_CALLBACK_STORAGE(key) 
CREATE_CALLBACK_STORAGE(mouse) 

donde sería fundamentalmente como esto:

#define CREATE_CALLBACK_STORAGE(x) capitalize(x)##CallbackType x##CallBack;

¿hay una manera de hacer esto, de modo que no tengo que pasar tanto en el provecho d ¿Y versiones en minúsculas de cada nombre?

Me doy cuenta de que no es mucho menos tipear para usar macros, pero el problema mismo comenzó a intrigarme.

+2

Una macro para un esquema de nombres tan simple parece que sería más confuso que útil. – GManNickG

+4

¡Muerte por macros! –

Respuesta

4

El macroprocesador no tiene la capacidad de tomar subcadenas o mayúsculas en una letra. Lo siento.

Si pudiera cambiar su esquema de nombres, podría tener más éxito. Por ejemplo:

QuitCallbackType _QuitCallback; 

Edición: He sido advertido de no utilizar guiones líder, pero la idea sigue siendo válida:

QuitCallbackType callbackQuit; 
+0

+1 para el esquema alternativo. De hecho, si el OP está utilizando una macro para definir las variables, ¿por qué no utilizar otra para acceder a ellas también ?, digamos '#define CALLBACK (x) _ ## x ## Callback' – casablanca

+6

@Mark: nombres que comienzan con guión bajo seguido de mayúscula La letra, como '_QuitCallback' en su ejemplo, está reservada para la implementación, en cualquier lugar. Eso también se aplica a los nombres con dos guiones bajos sucesivos. Por cierto, ya que comenté otra respuesta suya hace media hora más o menos, no, no estoy "siguiéndolo". :-) Voy a eliminar este comentario después de su edición. Cheers, –

+0

@Alf P. Steinbach: "Por cierto, ya que comenté otra respuesta suya hace media hora más o menos, no, no estoy" siguiéndote ". Excusatio non petita, accusatio manifesta. ;) –

2

creo que debe abandonar la idea de macros en total. Una mejor solución sería la creación de una estructura de datos simple, como:

struct CallBacks { 
    QuitCallbackType quit; 
    LossCallbackType loss; 
    PauseCallbackType pause; 
    KeyCallbackType key; 
    MouseCallbackType mouse; 
}; 

Y utilizar esto en su lugar:

CallBacks callback; 

Sólo se pueden utilizar los miembros desea:

callback.quit = GetCallback(...); 
someFunc(callback.quit); 
// ect.. 

También hace que los nombres de las variables (en mi opinión) sean un poco más claros.