2011-01-18 15 views
16

Qualche tempo fa ho scoperto un (piuttosto antica) C Compiler, che scansione macro in questo modo (Pseudo codice):Le istruzioni del preprocessore dovrebbero essere all'inizio di una riga?

if line.startswith("#include") or line.startswith("#define"): 
    ... 

.. Che tipo di sollevato la questione per me, dove in realtà dovrebbe essere collocate le macro, all'inizio di una riga, in questo modo:

void stuff() 
{ 
#if defined(WIN32) || defined(_WIN32) 
    ... 
#else 
#if defined(__GNUC__) 
    ... 
#else 
    ... 
#endif 
#endif 
} 

O meglio in questo modo (in quanto questo è il modo in cui lo faccio, per migliorare la leggibilità):

void stuff() 
{ 
    #if defined(WIN32) || defined(_WIN32) 
    ... 
    #else 
    # if defined(__GNUC__) 
    ... 
    # else 
    ... 
    # endif 
    #endif 
} 

Il modo in cui il rientro del codice del preprocessore è standardizzato, ovvero indipendentemente dal modo in cui lo indentro, funzionerà sempre allo stesso modo?

+5

Love the pseudocode: D. "Pseudocodice" è un ottimo linguaggio. –

risposta

13

Alcuni vecchi compilatori C richiesto che il #define (per esempio) essere a filo con la margine sinistro:

#define FOO bar 

altri compilatori C richiesti solo che il # essere al margine sinistro, così da poter:

# define FOO bar 

Nuovo compilatori er C tendono ad accettare la # dopo un qualsiasi spazio:

#define FOO bar 

Se volete la compatibilità con tali compilatori più anziani, si dovrebbe almeno mettere il # nella prima colonna. Se la compatibilità non è importante, dipende da te.

In genere, proverei a non incorporare i blocchi #ifdef all'interno delle funzioni, quindi l'intera questione se debbano essere rientrati per lo più scompare.

+0

Immagino che non dovrei preoccuparmi del supporto per compilatori come ZetaC, che fortunatamente sono usati molto raramente ;-) –

+0

"Se vuoi la compatibilità con questi vecchi compilatori" - allora dovrai lavorare dove altro non implementano nemmeno C89, tanto meno C99? –

+0

Stai parlando di compilatori pre-ANSI K & R v1. Quindi dimentica le dichiarazioni di funzione e gli elenchi di parametri. – MSalters

-3

Non credo che il compilatore "preoccupa" se si dispone di spazi prima del pre-elaborato - dovrebbe essere lo stesso ...

+3

Non indovinare ... –

2

No, non è necessario che siano all'inizio della riga, ma possono avere solo spazi (spazi, tabulazioni, ...) prima di loro.

Di solito vengono inseriti all'inizio della riga perché non sono soggetti agli ambiti in cui si trovano, poiché sono preelaborati prima del codice C attuale.

+0

Gli spazi bianchi sono consentiti dopo '#', come in '# include ' –

+2

Sì, certo. Sto affermando il contrario? – peoro

13

da gcc C preprocessor documentation:

direttive al preprocessore sono linee in vostro programma che iniziano con #'. Whitespace is allowed before and after the #'.

+0

@Will: probabilmente hai scritto questo commento prima di aggiungere la seconda frase alla citazione :) – davka

-1

Non importa. Guardalo in questo modo, se il codice non fosse identificato e in 1 riga dovrebbe comunque essere compilato (solo il codice, il preprocessore/include in alcune altre cose ha bisogno di una linea separata).

Modifica: sembra che il compilatore molto vecchio sia schizzinoso su questo. Il preprocessore dovrebbe trovarsi su una riga, proprio come le altre cose non di codice come

+1

Se il codice non era rientrato di un tutto su una riga, non verrebbe compilato: il preprocessore è sensibile alla linea. –

+0

Stick to C# .... –

+0

sì dimentica quella parte. Il preprocessore deve essere su 1 riga (senza nient'altro), ma per il codice non importa. – RvdK

Problemi correlati