Come creo una macro C per ottenere il valore intero di una stringa? Il caso d'uso specifico sta seguendo da una domanda here. Voglio cambiare il codice come questo:Utilizzo di C Preprocessing per ottenere il valore intero di una stringa
enum insn {
sysenter = (uint64_t)'r' << 56 | (uint64_t)'e' << 48 |
(uint64_t)'t' << 40 | (uint64_t)'n' << 32 |
(uint64_t)'e' << 24 | (uint64_t)'s' << 16 |
(uint64_t)'y' << 8 | (uint64_t)'s',
mov = (uint64_t)'v' << 16 | (uint64_t)'o' << 8 |
(uint64_t)'m'
};
A tal:
enum insn {
sysenter = INSN_TO_ENUM("sysenter"),
mov = INSN_TO_ENUM("mov")
};
Dove INSN_TO_ENUM
espande allo stesso codice. La performance sarebbe la stessa, ma la leggibilità sarebbe aumentata di molto.
sto ritenendo sospetto che in questa forma potrebbe non essere possibile a causa di un'incapacità C del preprocessore per l'elaborazione delle stringhe, quindi questo sarebbe anche una soluzione unpreferred ma accettabile (argomento macro variabile):
enum insn {
sysenter = INSN_TO_ENUM('s','y','s','e','n','t','e','r'),
mov = INSN_TO_ENUM('m','o','v')
};
A questo punto scriverei il mio pre-pre-processore. Cercare di farlo a modo tuo sarà solo dolorosamente rivoltante. È uno script banale da scrivere nel tuo linguaggio di scripting preferito. Supponendo che le tue enumerazioni siano relativamente statiche nel tempo (cioè non le stai modificando giorno dopo giorno) allora penso che sarebbe comodo e leggibile. –
@DavidHeffernan: l'ho considerato, ma come ultima risorsa. Se si può fare come macro, abbiamo il vantaggio della leggibilità oltre a essere in grado di astrarre/nascondere questo particolare particolare di implementazione. IMO i vantaggi superano la possibilità di generare tramite 'pre-pre-elaborazione'. –
Non sono sicuro se è possibile che la macro gestisca gli argomenti delle variabili o semplicemente la accetta per passarla in giro. Vedi la mia risposta per l'argomento 1. – Shahbaz