Domanda

Stavo guardando il programma su http: //www0.us.ioccc. org / 1988 / westley.c , menzionato in un'altra risposta SO : si suppone che stampi il valore di pi, circa 3.142, ma quando lo compilo ed eseguo ottengo 0.250. Sembra che quando il preprocessore GCC (sia 4.1.2 che 3.4.6 testato) viene eseguito sul codice, converta

#define _ -F<00||--F-OO--;
_-_-_

a

-F<00||--F-OO--;- -F<00||--F-OO--;- -F<00||--F-OO--;

ma penso che, affinché il programma funzioni, dovrebbe essere

-F<00||--F-OO--;--F<00||--F-OO--;--F<00||--F-OO--;

vale a dire. GCC sta inserendo uno spazio aggiuntivo prima del & Quot; macro & Quot; espansione. È così che dovrebbe funzionare #define? (È cambiato dal 1988?)

EDIT : inoltre, qualsiasi informazione su come impedire la visualizzazione di tali spazi sarebbe apprezzata.

È stato utile?

Soluzione

Il preprocessore funziona su token, non strettamente sul testo. Quindi tecnicamente non & Quot; inserisci uno spazio & Quot; nel mezzo, ma a meno che non gli dica esplicitamente di incollare due token insieme all'operatore ##, non lo farà. In questo caso le due - linee macro trasversali vengono conteggiate come due token diversi, entrambi significano meno unario, non decremento.

vedi anche: http://en.wikipedia.org/wiki/C_preprocessor#Token_concatenation

Altri suggerimenti

Solo i preprocessori molto più vecchi non hanno inserito quello spazio extra - nota che la voce originale è stata presentata oltre 20 anni fa nel 1988, prima che la versione del 1989 dello standard C fosse standardizzata. Puoi passare il -traditional-cpp flag al preprocessore GCC, che lo fa imitare il comportamento dei preprocessori C vecchio stile, al contrario dei preprocessori ISO C.

Dallo standard C99:

  

Una direttiva di preelaborazione del modulo

     

# definisce la lista di sostituzione dell'identificatore nuova riga

     

definisce una macro simile a un oggetto che causa la sostituzione di ogni istanza successiva del nome della macro con l'elenco di sostituzione dei token di preelaborazione che costituisce il resto della direttiva.

Quindi le macro funzionano sui token e ci si aspetta lo spazio bianco.

E puoi ottenere l'output desiderato utilizzando l'operatore di incollaggio token, ##, ma per farlo devi usare qualche ulteriore bruttezza macro:

#define PASTE2( x, y) x##y
#define PASTE( x, y) PASTE2(x, y)

#define _ -F<00||--F-OO--;


PASTE(PASTE(PASTE(PASTE(_,-),_),-),_)

Quindi non sono sicuro che questa sia una vera risposta per te.

Puoi usare un insieme meno brutto di macro per ottenere le espressioni che desideri: ci saranno ancora degli spazi, ma gli spazi non interferiranno con la creazione degli operatori '--':

_ PASTE(-,_) PASTE(-,_)

Dubito comunque che sia quello che vuoi,

Sì, gcc sta inserendo spazi extra (verificare controllando l'output stdout di gcc -E westley.c (. Per quanto ne so questo comportamento è conforme allo standard.

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