2014-08-27 19 views
14

Questo codice può essere compilato per gcc -g -o main main.c, nessun avviso.linguaggio C: significato dell'operatore "#"?

// main.c 
# 41 "stdio.h" 
# 22 
# 
int main(void){ 
    (void)printf("foo"); 
    return 0; 
} 

La mia domanda è:

  1. Qual è il significato di operatore "#" prima "comprendono". Usiamo #include <stdio.h> per includere il file di intestazione, perché non include <stdio.h>?

  2. Perché # 22 o # 41 può essere compilato, non l'ho mai visto prima.

Chiunque può aiutarmi?

+4

http://stackoverflow.com/questions/7110683/what-is-the-use-of-in-c-or-c controllo questa bro –

+1

@mkpchiran: Il tuo link non spiega il problema sopra. – deepmax

risposta

8

Sembra l'output del preprocessore. La linea

# 41 "stdio.h" 

può essere interpretato come:

  • 41 ha il significato:

specifica il numero di riga che deve essere riportata la seguente riga di ingresso. Le linee successive sono contate da lino.

  • "stdio.h" è solo il nome del file da cui sono prese le linee.

la seguente riga e tutte le righe successive sono riportati venire dal file specifica, fino a quando qualcosa accade a cambiamento che. nomefile viene interpretato in base alle normali regole per una costante di stringa : gli escape di backslash vengono interpretati.

E tutte queste informazioni è tratto da https://gcc.gnu.org/onlinedocs/cpp/Line-Control.html#Line-Control e https://gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html#Preprocessor-Output

Per il singolo #:

La direttiva nulla è costituito da un '#' seguito da un ritorno a capo, con solo spazi bianchi (tra cui commenti) in mezzo. Una direttiva nulla è intesa come una direttiva di pre-elaborazione, ma non ha alcun effetto sull'output del preprocessore. Il significato principale dell'esistenza della direttiva nulla è che una linea di input costituita da un semplice '#' non produrrà output, piuttosto che una riga di output contenente solo un '#'. Presumibilmente alcuni vecchi programmi C contengono tali linee.

tratto da https://gcc.gnu.org/onlinedocs/cpp/Other-Directives.html#Other-Directives

2

A # all'inizio di una riga viene introdotta una direttiva di preelaborazione. La preelaborazione è concettualmente una fase precedente della traduzione rispetto alla compilazione, motivo per cui utilizza una sintassi facilmente riconoscibile.

Se il # è seguita da qualcosa di diverso dainclude, define, undef, line, error o pragma, allora è un non direttiva (6.10p1), e viene ignorato.

Ciò significa che # all'inizio di una riga è un modo semplice per il compilatore di passare le informazioni tra le fasi della traduzione; qui viene utilizzato per passare il file sorgente e le informazioni sul numero di riga.