2015-10-12 9 views
17

Sto cercando di capire il processo di compilazione. Possiamo vedere il file intermedio preprocessore utilizzando:Cosa significano i numeri nei file .ii preelaborati durante la compilazione di C con gcc?

gcc -E hello.c -o hello.i 

o

cpp hello.c > hello.i 

ho più o meno so quale sia il preprocessore fa, ma ho difficoltà a capire i numeri in alcune delle linee. Ad esempio:

# 1 "/usr/include/stdc-predef.h" 1 3 4 
# 1 "<command-line>" 2 
# 1 "hello.c" 
# 1 "/usr/include/stdio.h" 1 3 4 
# 27 "/usr/include/stdio.h" 3 4 
# 1 "/usr/include/features.h" 1 3 4 
# 374 "/usr/include/features.h" 3 4 

I numeri possono aiutare il debugger a visualizzare i numeri di riga. Quindi la mia ipotesi per la prima colonna è il numero di riga per il file colonna 2. Ma cosa fanno i seguenti numeri?

+0

Possibile duplicato (http://stackoverflow.com/questions/5370539/what-is-the-meaning-of-lines-starting-with-a-hash-sign-and-number-like-1-ac) – jww

risposta

8

I numeri seguenti il ​​nome del file sono bandiere:

1: Indica l'inizio di un nuovo file.

2: indica il ritorno a un file (dopo aver incluso un altro file).

3: indica che il seguente testo proviene da un file di intestazione di sistema, pertanto è necessario sopprimere determinati avvisi.

4: indica che il seguente testo deve essere considerato come avvolto in un blocco "C" extern implicito.

Fonte: [? Qual è il significato di linee che iniziano con un cancelletto e il numero come '# 1 'ac'' nell'output preprocessore gcc] https://gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html

+0

Grazie. È un'informazione molto utile. Sto ancora cercando di capire come questi si inseriscono nell'immagine. Potresti spiegarci un po '? Continuerò anche la mia ricerca sulla base della tua fonte, vedi come sono state interpretate queste bandiere. – Conan

+0

Credo che i flag 1 e 2 abbiano lo scopo di dare un'idea della natura annidata dei file include, quindi è evidente chi ha incluso chi. Le intestazioni di sistema possono contenere costrutti non standard, quindi l'indicatore 3 dice al compilatore che quei costrutti sono accettabili in quel contesto. E poiché i file di intestazione potrebbero essere inclusi da entrambi i sorgenti C o C++, il flag 4 consente al compilatore C++ di non eseguire alcun nome di manomissione. – dbush

+0

Le versioni recenti di gcc possono utilizzare "la natura nidificata" per mostrare la successione di include-file in cui si trova un problema. È discutibile se ciò sia utile, dal momento che le versioni più recenti non hanno offerto un nuovo tipo di controllo dei caratteri o una migliore analisi, e come risultato semplicemente ingrandire i piccoli problemi esistenti. –

Problemi correlati