2010-10-15 25 views
6

sto usando macro del preprocessore di dichiarare alcune variabili ripetitive, in particolare:C++ macro - capitalizzare stringa

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

Vorrei utilizzare una macro preprocessore per farlo, alla


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

dove sarebbe essenzialmente essere come questo:

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

c'è un modo per fare questo, in modo che io non devo passare sia nel capitalizzare d E versioni minuscole di ciascun nome?

Mi rendo conto che non è molto più semplice digitare i macro, ma il problema in sé ha iniziato ad intrigarmi.

+2

Una macro per uno schema di denominazione così semplice sembra essere più confusa che utile. – GManNickG

+4

Morte per macro! –

risposta

4

Il preprocessore della macro non ha la capacità di eseguire sottostringhe o lettere maiuscole. Scusate.

Se è possibile modificare lo schema di denominazione si potrebbe avere più successo. Per esempio:

QuitCallbackType _QuitCallback; 

Edit: Sono stato avvertito di non usare sottolineature che porta, ma l'idea si applica ancora:

QuitCallbackType callbackQuit; 
+0

+1 per lo schema alternativo. Infatti, se l'OP utilizza una macro per definire le variabili, perché non usarne un'altra per accedervi, ad esempio '#define CALLBACK (x) _ ## x ## Callback' – casablanca

+6

@Mark: Nomi che iniziano con underscore seguito da maiuscole lettera, come '_QuitCallback' nel tuo esempio, sono riservati per l'implementazione, ovunque. Questo vale anche per i nomi con due underscore successivi. A proposito, dato che ho commentato un'altra tua risposta appena mezz'ora fa, no, non ti sto "seguendo". :-) Eliminerò questo commento dopo la tua modifica. Cheers, –

+0

@Alf P. Steinbach: "A proposito, dal momento che ho commentato un'altra tua risposta appena mezz'ora fa, no, non ti sto" seguendo "." Excusatio non petita, accusatio manifesta. ;) –

2

Penso che si dovrebbe abbandonare l'idea di macro completamente. Una soluzione migliore sarebbe quella di creare una semplice struttura dei dati, come ad esempio:

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

E utilizzare questo invece:

CallBacks callback; 

È possibile utilizzare solo i membri che si desidera:

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

Rende anche i nomi delle variabili (a mio parere) un po 'più chiari.