2013-05-16 5 views
5

Voglio convertire la costante di stringa in token di preelaborazione utilizzando la macro. Esempio:come convertire la costante di stringa in token di preelaborazione in C

 

    // get the first character of marco argument to postfix of new data type. 
    #define TYPE(typename) Prefix ## typename #typename[0] 
    void main() 
    { 
     TYPE(int) a, b, c; // Prefixinti a, b, c; 
     TYPE(float) x, y, z; // Prefixfloatf x, y, z; 
     a = 3; 
    } 

è possibile in C/C++?
p/s: scusa per il mio scarso inglese.
modificati

+8

Non è possibile unstringize, solo stringhe. – chris

+0

Ma questo dovrebbe essere tutto ciò che serve purché la costante non contenga virgole. – Medinoc

+3

Provato molto duramente, ma non resisto più: ** perché farlo? ** – WhozCraig

risposta

0

Non è possibile, anche con i modelli in C++. Ad ogni modo, evita di usare "typename" in C-code dato che è una parola chiave in C++, quindi il tuo codice C sarebbe difficile da portare.

Anche void main() non è strettamente portatile; usa invece int main().

+3

'typename' non fa differenza poiché il preprocessore viene eseguito prima del compilatore. – chris

+0

Vero ma ancora cattivo non credi? – Bathsheba

1

Si dovrebbe sempre ricordare ciò che fa il preprocessore, modifica il codice sorgente prima ancora che il compilatore lo veda.

Ciò compilare (ho rimosso le virgolette intorno int), ma non è così utile:

#define TYPE(typename) typename 

void main() 
{ 
    TYPE(int) a, b, c; 
    a = 3; 
} 

Quello che state facendo risultati nel seguente codice inviato al compilatore:

TYPE("int") a, b, c; 

risultati in"

"int" a, b, c; 

dove una costante stringa è seguita da una coppia di identificatori non dichiarate, whic h genera un errore di sintassi

+0

Voglio creare tipi di dati definiti dall'utente utilizzando le macro X. Esempio: in OpenGL. GLPoint3i, GLPoint3f: ottiene il primo carattere nel tipo di dati (int, float) nel postfix per i miei tipi di dati. – dangkhoasdc

+1

Penso che le variabili openGL siano create usando typedef. dai un'occhiata a http://en.wikipedia.org/wiki/X_Macro qui puoi vedere come usare la macro X, – hetepeperfan

3
#define TYPE(first_letter, rest) Prefix ## first_letter ## rest ## first_letter 

typedef int TYPE(i,nt); 
typedef float TYPE(f,loat); 

int main(void) 
{ 
    TYPE(i,nt) a, b, c; // Prefixinti a, b, c; 
    TYPE(f,loat) x, y, z; // Prefixfloatf x, y, z; 
} 
+0

Hai una soluzione migliore? Voglio 'TYPE (int) a, b, c; // Prefixiniti a, b, c;' – dangkhoasdc

+0

No, non so di un'altra soluzione. – pmg

Problemi correlati