Fare qualcosa sia un identificatore C che una stringa?
-
02-07-2019 - |
Domanda
Supponi di voler generare un elenco abbinato di identificatori e stringhe
enum
{
NAME_ONE,
NAME_TWO,
NAME_THREE
};
myFunction(NAME_ONE, "NAME_ONE");
myFunction(NAME_TWO, "NAME_TWO");
myFunction(NAME_THREE, "NAME_THREE");
.. senza ripetersi, e senza generare automaticamente il codice, usando le macro C / C ++
Indovina iniziale:
È possibile aggiungere un file #include contenente
myDefine(NAME_ONE)
myDefine(NAME_TWO)
myDefine(NAME_THREE)
Quindi usalo due volte come:
#define myDefine(a) a,
enum {
#include "definitions"
}
#undef myDefine
#define myDefine(a) myFunc(a, "a");
#include "definitions"
#undef myDefine
ma #define non ti consente di inserire parametri all'interno di una stringa?
Soluzione
Per il tuo secondo #define, devi usare l'operatore # preprocessore, in questo modo:
#define myDefine(a) myFunc(a, #a);
Questo converte l'argomento in una stringa.
Altri suggerimenti
Ecco un buon modo per dichiarare l'elenco dei nomi:
#define FOR_ALL_FUNCTIONS(F)\
F(NameOne)\
F(NameTwo)\
F(NameThree)\
#define DECLARE_FUNCTION(N)\
void N();
#define IMPLEMENT_FUNCTION(N)\
void N(){}
FOR_ALL_FUNCTIONS(DECLARE_FUNCTION);
FOR_ALL_FUNCTIONS(IMPLEMENT_FUNCTION);
In questo modo questo elenco di nomi può essere riutilizzato più volte. L'ho usato per prototipare nuove funzionalità linguistiche, anche se non ho mai finito di usarle. Quindi, se non altro, erano un ottimo modo per trovare vicoli ciechi nelle proprie invenzioni. Mi chiedo se sia perché ciò che dicono: "le macro sono cattive" ... :)