2013-06-22 7 views
7
int main(void) 
{ 
    #if 0 
    something" 
    #endif 
    return 0; 
} 

Un semplice programma sopra genera un avviso: missing terminating " character in gcc. Questo sembra strano, perché significa che il compilatore consente che i blocchi di codice tra #if 0 e endif abbiano una dichiarazione non valida come something qui, ma non le doppie virgolette " che non si accoppiano. Lo stesso accade nell'uso di #ifdef e #ifndef.I blocchi di codice tra #if 0 e #endif devono avere virgolette doppie accoppiate?

Commenti reali sono bene qui:

int main(void) 
{ 
    /* 
    something" 
    */ 
    return 0; 
} 

Perché? E la singola citazione ' si comporta allo stesso modo, ci sono altri token che stanno trattando in modo speciale?

+0

Quale compilatore? –

+0

@ IgnacioVazquez-Abrams Ho usato un gcc online per testare http://www.compileonline.com/compile_c_online.php –

+0

Impossibile riprodurre questo problema con clang (Apple LLVM versione 4.2 (clang-425.0.28) o gcc (i686- apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1) –

risposta

9

Vedere il comp.Lang.c FAQ, 11.19:

Under ANSI C, the text inside a "turned off" #if, #ifdef, or #ifndef must still consist of "valid preprocessing tokens." This means that the characters " and ' must each be paired just as in real C code, and the pairs mustn't cross line boundaries.

1

Il preprocessore funziona a livello di token e una stringa letterale è considerata un singolo token. Il preprocessore ti avvisa che hai un token non valido.

Secondo lo standard C99, un gettone di pre-elaborazione è una di queste cose:

  • header-nome
  • identi fi catore
  • pp-numero
  • carattere costante
  • stringhe letterali
  • punctuator
  • ogni carattere non di spazio bianco che non può essere uno dei sopra

Lo standard dice anche:

If a ' or a " character matches the last category, the behavior is undefined.

Cose come "dichiarazione" di cui sopra non sono validi per il compilatore C, ma è un segno valido e le elimina preprocessore questo token prima che arrivi al compilatore.

2

La compilazione deve passare attraverso molti cicli, prima di generare binari eseguibili.

Non sei ancora nel compilatore. Il tuo pre-processore segnala questo errore. Questo non controllerà la sintassi del linguaggio C, ma le virgolette mancanti, le parentesi e cose simili sono errori pre-processore.

Dopo questo passaggio pre-processore, il codice andrà al compilatore C, che rileverà l'errore vi aspettate ...

0

Accanto risposta del Kevin, Incompatibilities of GCC dice:

GCC complains about unterminated character constants inside of preprocessing conditionals that fail. Some programs have English comments enclosed in conditionals that are guaranteed to fail; if these comments contain apostrophes, GCC will probably report an error. For example, this code would produce an error:

#if 0 
You can't expect this to work. 
#endif 

The best solution to such a problem is to put the text into an actual C comment delimited by /*...*/ .

Problemi correlati