2013-08-23 11 views
13

starałem trochę niewygodne wyprzedzającym i wymyślił coś takiego:błąd Preprocessor przy definiowaniu =

#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 daje mi błędy:

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

dlaczego tak jest?

+2

Możliwy duplikat [Jakie są najgorsze makr świata/nadużycia procesorów, z którymi miałeś do czynienia kiedykolwiek?] (Http://stackoverflow.com/questions/652788/what-is-the-worst-real -world-macros-pre-procesor-nadużycie-ty-kiedykolwiek-natkniesz się) Po prostu żartuję, dobre pytanie. –

+1

Uruchamiając to przez preprocesor, testy zmieniają się w 'if (x = = 6)'. Nie jestem pewien, po co wstawia się przestrzeń ... prawdopodobnie ktoś, kto zna jedną z specyfikacji C znacznie lepiej niż ja, pojawi się ... – cdhowie

+4

Preprocesor zajmuje się tokenami, logicznie ze spacjami oddzielającymi tokeny. Kiedy tokenizuje 'if (x = SIX)', to ma 'if',' (',' x', '=' i 'SIX'. Gdy makro rozszerza' SIX', ma dodatkowe tokeny '=' i '6' .Ale sąsiednie tokeny' = 'nie są tym samym co jeden token' == '(i są w rzeczywistości nieprawidłową składnią C) - stąd błąd kompilacji –

Odpowiedz

15

Numer == to jeden token, którego nie można podzielić na pół. Należy uruchomić gcc -E na kodzie

Od GCC stron podręcznika:

-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.

Dla kodzie gcc -E daje następujący wynik

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

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

Drugi = jest, co powoduje, że komunikat o błędzie expected expression before ‘=’ token

5

Preprocesor nie działa na poziomie postaci, działa pod poziom oken. Więc kiedy wykonuje podstawienie, masz coś Odpowiednik:

if (x = = 6) 

zamiast żądanego:

if (x==6) 

Istnieją pewne szczególne wyjątki od tej reguły, jak operator # stringification.

+1

Skąd bierze się pusty odstęp między '=' i '6'? – alk

+1

@alk Używam spacji, aby pokazać granice tokenów. Jeśli chodzi o gramatykę C, nie ma różnicy między' = 6 'i' = 6'. – Barmar

0

Z jakiego zestawu narzędzi korzystasz? Jeśli używasz GCC, możesz dodać opcję -save-temps i sprawdzić wynik pośredni test.i, aby rozwiązać problem.

Podejrzewam, że masz spację między x= i =6.

4
if(x=SIX) 

jest analizowany jako

if (x= =6). 

Więc pojawia się błąd.

Powiązane problemy