Dlaczego wszystkie pliki C napisane przez mojego wykładowcę zaczynają się od pojedynczego # w pierwszym wierszu?

431

Przeglądam notatki z kursu języka C i każdy plik źródłowy programu w języku C zaczyna się od jednego #w pierwszym wierszu programu.

Następnie są puste wiersze, a za nimi następna mainfunkcja, po której następuje funkcja.

Jaki jest powód #?

(Teraz jest poza terminem i naprawdę nie mogę zapytać faceta.)

Oto przykład:

#

#include <stdio.h>
int main() {
   printf("Hello, World!");
   return 0;
}
Główny człowiek
źródło
3
Pierwszy przykład podam w notatkach z kursu. Dosłownie jest #, a następnie pusty wiersz, a następnie program.
The Main Man
30
Głównym celem opróżniania #jest zaciemnianie. Jeśli chcesz zmylić wszystkich, możesz na przykład uruchomić wszystkie pliki źródłowe linią #//#BEGIN#\\#(co absolutnie nic nie robi).
Lundin,
3
@Bathsheba To prawdopodobnie jedna z tych osób cl.cam.ac.uk/people/academic.html
TylerH
7
@Bathsheba Znaczniki czasu na tym ostatnim pokazują, że udzieliłeś dość szczegółowej odpowiedzi zaledwie minutę po zadaniu pytania, wraz z odpowiednią cytatem ze standardu odniesienia C99. Jesteś zdecydowanie osobą spiskową. Być może u iluminatów. Dlaczego oba pytania stały się tak popularne?
Nat

Odpowiedzi:

614

Wow, ten wymóg idzie drodze powrotnej do 1970 roku.

W pierwszych dniach wstępnie znormalizowanego C, jeśli chciałeś wywołać preprocesor , musiałeś napisać #jako pierwszą rzecz w pierwszej linii pliku źródłowego. Pisanie tylko# na początku pliku daje elastyczność w rozmieszczeniu innych dyrektyw preprocesora.

Z oryginalnego projektu C autorstwa wielkiego Dennisa Ritchiego :

12. Linie sterujące kompilatora

[...] Aby wywołać preprocesor [], konieczne jest, aby pierwsza linia programu zaczynała się od #. Ponieważ wiersze zerowe są ignorowane przez preprocesor, wiersz ten nie musi zawierać żadnych innych informacji.

Ten dokument jest świetny do czytania (i pozwolił mi skoczyć na to pytanie jak szalony kot).

Podejrzewam, że to wykładowca jest po prostu sentymentalny - nie było to wymagane od ANSI C.

Batszeba
źródło
22
Jak rozumiem, wymaganie nie jest takie, że pierwszy znak musi być #sam w linii, tylko że zaczyna się od #, więc dlaczego nie przejść bezpośrednio po #include? A może źle to rozumiem?
Federico klez Culloca,
14
@Bathsheba " Aby wywołać ten preprocesor, konieczne jest, aby pierwsza linia programu zaczynała się od #. Ponieważ linie zerowe są ignorowane przez preprocesor, linia ta nie musi zawierać żadnych innych informacji. " <- więc to może już zawierać dyrektywę preprocesora, ale nie jest to konieczne ....
5
Nie było to wymagane, kiedy zacząłem programować w C (1980). ANSI C nie była znormalizowana do 1989 r.
pojo-guy
29
@ federico-klez-culloca Jeśli zostanie dołączony, plik może skończyć się bez wiodącego #, ponieważ w przyszłości ktoś usunie niepotrzebne dołączenie, nieświadomy skutków ubocznych wiodącego #.
Fadeway,
4
@Casanova - Nie. Takie postępowanie i zaakceptowanie takiej odpowiedzi jest sprzeczne z regulaminem witryny. Pytanie i udzielanie odpowiedzi na różnych kontach jest sprzeczne z duchem zasad witryny, nawet bez wzajemnego głosowania, jeśli rozumiesz. Odpowiedź na własne pytanie i zaakceptowanie tej odpowiedzi przy użyciu tego samego konta nie stanowi żadnej szkody - robiłem to w przeszłości.
Batszeba
1

Nic nie robi

Od standardu ISO C / C ++:

Dyrektywa wstępnego przetwarzania formularza

# new-line

nie ma wpływu.

Tak więc w dzisiejszych kompilatorach ten pusty skrót nic nie robi (podobnie jak - new-line ;nie ma funkcjonalności).


PS : W pre-standaryzowany C , # new-linemiał ważną rolę, był używany do wywołania C preprocesor (jak podkreślił @Bathsheba). Tak więc kod tutaj został napisany w tym czasie lub pochodzi z przyzwyczajenia.

Minhas Kamal
źródło
-5

Musisz wiedzieć o procesie kompilacji C. Ponieważ to jest „musisz wiedzieć”, w jaki sposób kod źródłowy przekształca się w wykonywalny kod binarny (plik).

Z procesu kompilacji kod źródłowy C musi przejść przez sekcję preprocesora. Ale jak powiedzieć kompilatorowi, aby wstępnie przetworzył kod? ... Że symbol czasu # został wprowadzony do wskaźnika Preprocess kompilatora.

Na przykład #define PI 3.141jest w kodzie źródłowym. Następnie zostanie to zmienione po sesji Wstępnego przetwarzania. Oznacza to, że wszystkie PI zostaną zmienione na 3.141.

W ten #include <stdio.h>sposób do kodu źródłowego zostaną dodane standardowe funkcje we / wy.

Jeśli masz maszynę z Linuksem, skompiluj jak gcc -save-temps source_code.c. I zobacz wyniki kompilatora.

GOBI
źródło