2013-08-23 10 views
13

ho cercato un po 'di pre-elaborazione scomoda e si avvicinò con qualcosa di simile:errore preprocessore quando si definisce =

#include <stdio.h> 

#define SIX =6 

int main(void) 
{ 
    int x=6; 
    int y=2; 

    if(x=SIX) 
    printf("X == 6\n"); 
    if(y=SIX) 
    printf("Y==6\n"); 

    return 0; 
} 

gcc mi dà gli errori:

test.c: In function ‘main’:
test.c:10:8: error: expected expression before ‘=’ token
test.c:12:8: error: expected expression before ‘=’ token

perché?

+2

Possibile duplicato di [Qual è il peggiore utilizzo di macro/pre-processore nel mondo reale?] (Http://stackoverflow.com/questions/652788/what-is-the-worst-real -world-macros-pre-processor-abuse-youve-ever-come-across) Sto solo scherzando, bella domanda. –

+1

Eseguendo questo attraverso il preprocessore, i test si trasformano in 'if (x = = 6)'. Non sono sicuro del motivo per cui lo spazio è inserito ... presumibilmente qualcuno che conosce una delle specifiche C molto meglio di me arriverà ... – cdhowie

+4

Il preprocessore si occupa di token, logicamente con gli spazi che separano i token. Quando tokenizza 'if (x = SIX)', ha 'if',' (',' x', '=', e 'SIX'. Quando la macro espande' SIX', ha token extra '=' e '6' .Ma due token adiacenti' = 'non sono la stessa cosa di un token' == '(e sono in effetti una sintassi C non valida) - quindi l'errore di compilazione –

risposta

15

Lo == è un token singolo, non può essere diviso a metà. È consigliabile eseguire gcc -E sul vostro codice

Dalla pagine di manuale di GCC:

-E Stop after the preprocessing stage; do not run the compiler proper. The output is in the form of preprocessed source code, which is sent to the standard output.

Input files that don't require preprocessing are ignored.

Per il vostro codice di gcc -E ha pronunciato la seguente uscita

if(x= =6) 
    printf("X == 6\n"); 

    if(y= =6) 
    printf("Y==6\n"); 

Il secondo = è ciò che provoca il messaggio di errore expected expression before ‘=’ token

5

Il preprocessore non funziona a livello di carattere, funziona sul t livello oken. Così, quando si esegue la sostituzione, si ottiene qualcosa di equivalente a:

if (x = = 6) 

piuttosto che la vostra desiderata:

if (x==6) 

Ci sono alcune eccezioni specifiche per questo, come l'operatore # in stringa.

+1

Da dove viene il bianco tra '=' e '6'? – alk

+1

@alk Sto solo usando gli spazi per mostrare i limiti dei token. Per quanto riguarda la grammatica C, non c'è differenza tra' = 6 'e' = 6'. – Barmar

0

Quale toolchain stai usando? Se si utilizza GCC, è possibile aggiungere l'opzione -save-temps e verificare il risultato intermedio test.i per risolvere il problema.

Sospetto di avere uno spazio tra lo x= e lo =6.

4
if(x=SIX) 

viene analizzato come

if (x= =6). 

Così si ottiene l'errore.