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?

È stato utile?

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" ... :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top