Warum beginnen alle von meinem Dozenten geschriebenen C-Dateien mit einem einzigen # in der ersten Zeile?

431

Ich gehe einige C-Kursnotizen durch und jede C-Programmquelldatei beginnt mit einer einzelnen #in der ersten Zeile des Programms.

Dann gibt es leere Zeilen und folgt den anderen Dingen, denen die mainFunktion folgt .

Was ist der Grund für die #?

(Es ist jetzt veraltet und ich kann den Kerl nicht wirklich fragen.)

Hier ist ein Beispiel:

#

#include <stdio.h>
int main() {
   printf("Hello, World!");
   return 0;
}
Der Hauptmann
quelle
3
Ich habe das erste Beispiel in die Kursnotizen aufgenommen. Es gibt buchstäblich die #, dann eine leere Zeile, dann das Programm.
Der
30
Der Hauptzweck von leer #ist die Verschleierung. Wenn Sie alle verwirren möchten, können Sie beispielsweise alle Ihre Quelldateien mit der Zeile beginnen #//#BEGIN#\\#(was absolut nichts bewirkt).
Lundin
3
@Bathsheba Es ist wahrscheinlich einer dieser Leute cl.cam.ac.uk/people/academic.html
TylerH
7
@Bathsheba Die Zeitstempel auf dem letzten zeigen, dass Sie nur eine Minute nach dem Stellen der Frage eine einigermaßen detaillierte Antwort gegeben haben, einschließlich eines relevanten Zitats aus dem C99-Referenzstandard. Du bist definitiv eine Verschwörungsperson. Möglicherweise in den Illuminaten. Wie sind beide Fragen so beliebt geworden?
Nat

Antworten:

614

Wow, diese Anforderung reicht bis in die 1970er Jahre zurück.

Wenn Sie in den frühen Tagen von vorstandardisiertem C den Präprozessor aufrufen wollten , mussten Sie #als erstes in die erste Zeile einer Quelldatei schreiben . Wenn Sie nur ein #Zeichen oben in die Datei schreiben, können Sie die anderen Präprozessoranweisungen flexibel platzieren.

Aus einem Original-C-Entwurf des großen Dennis Ritchie selbst :

12. Compiler-Steuerleitungen

[...] Damit [der] Präprozessor aufgerufen wird, muss die allererste Zeile des Programms mit # beginnen. Da Nullzeilen vom Präprozessor ignoriert werden, muss diese Zeile keine weiteren Informationen enthalten.

Dieses Dokument eignet sich hervorragend zum Lesen (und hat mir erlaubt, wie eine verrückte Katze auf diese Frage zu springen).

Ich vermute, es ist der Dozent, der einfach nur sentimental ist - es ist seit ANSI C nicht mehr erforderlich.

Bathseba
quelle
22
So wie ich es verstehe, ist die Anforderung nicht, dass das allererste Zeichen ein #in einer Zeile für sich sein muss, sondern dass es mit einem beginnt. #Warum also nicht direkt für ein #include? Oder verstehe ich es falsch?
Federico klez Culloca
14
@Bathsheba " Damit dieser Präprozessor aufgerufen wird, muss die allererste Zeile des Programms mit # beginnen. Da Nullzeilen vom Präprozessor ignoriert werden, muss diese Zeile keine weiteren Informationen enthalten. " <- also kann bereits eine Präprozessor-Direktive enthalten, ist aber nicht erforderlich ....
5
Es war keine Voraussetzung, als ich anfing, in C (1980) zu programmieren. ANSI C wurde erst 1989 standardisiert.
Pojo-Typ
29
@ federico-klez-culloca Wenn es sich um ein Include handelt, wird die Datei möglicherweise ohne ein führendes # enden, da in Zukunft jemand ein nicht benötigtes Include löscht, ohne die Nebenwirkungen des führenden # zu kennen.
Fadeway
4
@Casanova - Nein. Dies zu tun und eine solche Antwort zu akzeptieren, verstößt gegen die Site-Regeln. Fragen und Antworten unter verschiedenen Konten verstoßen gegen den Geist der Regeln der Website, auch ohne gegenseitige Abstimmung, wenn Sie meine Bedeutung verstehen. Es schadet nicht, Ihre eigene Frage zu beantworten und diese Antwort mit demselben Konto zu akzeptieren - das habe ich in der Vergangenheit getan.
Bathseba
1

Tut nichts

Ab dem ISO-Standard von C / C ++:

Eine Vorverarbeitungsanweisung des Formulars

# new-line

hat keine Wirkung.

In heutigen Compilern macht dieser leere Hash also nichts (wie - new-line ;hat keine Funktionalität).


PS : In vorab standardisiert C , # new-linehatte eine wichtige Rolle, es verwendet wurde , die C Pre-Processor (Wie von @Bathsheba) aufzurufen. Der Code hier wurde also entweder innerhalb dieses Zeitraums geschrieben oder kam aus Gewohnheit.

Minhas Kamal
quelle
-5

Sie müssen über den Kompilierungsprozess von C Bescheid wissen. Denn das ist "muss wissen", wie der Quellcode in ausführbaren Binärcode (Datei) konvertiert wird.

Beim Kompilierungsprozess muss der C-Quellcode den Vorprozessorabschnitt durchqueren. Aber wie kann man den Compiler anweisen, den Code vorzuverarbeiten? ... Dass das Zeitsymbol # in den Indikator für die Vorverarbeitung zum Compiler eingeführt wurde.

Zum Beispiel #define PI 3.141ist im Quellcode. Dann wird es nach der Vorverarbeitungssitzung geändert. Das heißt, alle PI werden in 3.141 geändert.

Auf diese Weise #include <stdio.h>werden die Standard-E / A-Funktionen Ihrem Quellcode hinzugefügt.

Wenn Sie einen Linux-Computer haben, kompilieren Sie wie gcc -save-temps source_code.c. Und sehen Sie sich die Compiler-Ausgaben an.

GOBI
quelle