2015-10-12 10 views
17

Próbuję zrozumieć proces kompilacji. Widzimy plik pośredni za pomocą preprocesora:Co oznaczają liczby w wstępnie przetworzonych plikach .i podczas kompilowania C z gcc?

gcc -E hello.c -o hello.i 

lub

cpp hello.c > hello.i 

grubsza wiedzieć, co robi preprocesora, ale mam trudności ze zrozumieniem numery niektórych linii. Na przykład:

# 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 

Numery mogą pomóc debuggerowi w wyświetlaniu numerów linii. Więc domyślam się, że pierwsza kolumna jest numerem wiersza dla pliku nr 2 kolumny. Ale co robią te numery?

+0

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

Odpowiedz

8

następujące numery nazwę pliku są flagi:

1: Oznacza to początek nowego pliku.

2: Oznacza powrót do pliku (po dołączeniu innego pliku).

3: Oznacza to, że następujący tekst pochodzi z pliku nagłówkowego systemu, więc niektóre ostrzeżenia powinny zostać wyłączone.

4: Oznacza to, że poniższy tekst powinien być traktowany jako zawinięty w ukryty zewnętrzny blok "C".

Źródło: [? Jakie jest znaczenie linii zaczynających się znakiem hash i numer jak „# 1«ac»” w gcc wyjściu preprocesora] https://gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html

+0

Dziękuję. Jest to bardzo przydatna informacja. Wciąż próbuję zrozumieć, jak te pasują do obrazu. Czy możesz wyjaśnić trochę? Będę również kontynuował badania w oparciu o twoje źródło, zobacz, jak te flagi zostały zinterpretowane. – Conan

+0

Wierzę, że flagi 1 i 2 mają na celu dać wyobrażenie o zagnieżdżonym charakterze plików włączających, więc oczywiste jest, kto zawierał kto. Nagłówki systemowe mogą zawierać konstrukcje niestandardowe, więc flaga 3 mówi kompilatorowi, że te konstrukcje są dopuszczalne w tym kontekście. A ponieważ pliki nagłówkowe mogą być zawarte w źródle C lub C++, flaga 4 pozwala kompilatorowi C++ nie wykonywać wymazywania nazw. – dbush

+0

Najnowsze wersje gcc mogą używać "zagnieżdżonej natury", aby pokazać kolejność plików włączających, w których leży problem. Można się zastanowić, czy jest to przydatne, ponieważ nowsze wersje nie oferowały nowszej kontroli typów lub lepszej analizy, a w rezultacie po prostu powiększają istniejące małe problemy. –

Powiązane problemy