Perché tutti i file C scritti dal mio docente iniziano con un singolo # sulla prima riga?


431

Sto esaminando alcune note del corso C e ogni file sorgente del programma C inizia con un singolo #sulla prima riga del programma.

Quindi ci sono linee vuote e seguendo quella roba seguita dalla mainfunzione.

Qual è la ragione per #?

(È fuori termine ora e non posso davvero chiedere al ragazzo.)

Ecco un esempio:

#

#include <stdio.h>
int main() {
   printf("Hello, World!");
   return 0;
}


3
Ho messo il primo esempio nelle note del corso. Letteralmente c'è la #, quindi una riga vuota, quindi il programma.
The Main Man,

30
Lo scopo principale del vuoto #è l'offuscamento. Se vuoi confondere il diavolo con tutti, potresti ad esempio avviare tutti i tuoi file sorgente con la linea #//#BEGIN#\\#(che non fa assolutamente nulla).
Lundin,

3
@Bathsheba È probabilmente una di queste persone cl.cam.ac.uk/people/academic.html
TylerH,

7
@Bathsheba I timestamp su quell'ultimo mostrano che hai dato una risposta ragionevolmente dettagliata solo un minuto dopo la domanda, completa di una citazione pertinente dallo standard di riferimento C99. Sei decisamente una persona cospiratrice. Forse negli Illuminati. In che modo però entrambe le domande sono diventate così popolari?
Nat

Risposte:


614

Wow, questo requisito va di nuovo modo al 1970.

Nei primissimi giorni della C pre-standardizzata, se si voleva invocare il preprocessore , è stato necessario scrivere a #come prima cosa nella prima riga di un file sorgente. Scrivere solo a #nella parte superiore del file offre flessibilità nel posizionamento delle altre direttive del preprocessore.

Da una bozza C originale del grande Dennis Ritchie stesso :

12. Linee di controllo del compilatore

[...] Per far invocare [il] preprocessore, è necessario che la prima riga del programma inizi con #. Poiché le linee nulle vengono ignorate dal preprocessore, questa linea non deve contenere altre informazioni.

Quel documento è un'ottima lettura (e mi ha permesso di saltare su questa domanda come un gatto pazzo).

Ho il sospetto che il docente sia semplicemente sentimentale - non è stato richiesto certamente dall'ANSI C.


22
A quanto ho capito, il requisito non è che il primissimo personaggio debba essere un #su una linea da solo, solo che inizia con un #, quindi perché non andare direttamente per un #include? O sto capendo male?
Federico Klez Culloca,

14
@Bathsheba " Per fare in modo che questo preprocessore venga invocato, è necessario che la prima riga del programma inizi con #. Poiché le linee nulle vengono ignorate dal preprocessore, questa riga non deve contenere altre informazioni. " <- quindi può già contenere una direttiva preprocessore, ma non è necessario ....

5
Non è stato un requisito quando ho iniziato a programmare in C (1980). ANSI C non fu standardizzato fino al 1989.
pojo-guy

29
@ federico-klez-culloca Se diventa un'inclusione, il file potrebbe finire senza un # iniziale perché in futuro qualcuno elimina un'inclusione non necessaria mentre non è a conoscenza degli effetti collaterali dell'inizio #.
Dissolvenza il

4
@Casanova - No. Fare questo e accettare una simile risposta è in contrasto con le regole del sito. Chiedere e rispondere con account diversi è contro lo spirito delle regole del sito anche senza voto reciproco, se capisci il mio significato. Non c'è nulla di male nel rispondere alla tua domanda e nell'accettare quella risposta con lo stesso account - l'ho fatto in passato.
Bathsheba,

1

Non fa nulla

Secondo lo standard ISO di C / C ++:

Una direttiva di preelaborazione del modulo

# new-line

non ha alcun effetto.

Quindi nei compilatori di oggi, quell'hash vuoto non fa nulla (come- new-line ;non ha funzionalità).


PS : In C pre-standardizzato , ha # new-lineavuto un ruolo importante, è stato usato per invocare il Pre-Processore C (come sottolineato da @Bathsheba). Quindi, il codice qui è stato scritto in quel periodo di tempo, o è venuto dall'abitudine.


-5

Devi conoscere il processo di compilazione di C. Perché questo è "deve sapere" come il codice sorgente si converte in codice binario eseguibile (file).

Dal processo di compilazione, il codice sorgente C deve attraversare la sezione pre-processore. Ma come dire al compilatore di preelaborare il codice? ... Che il simbolo # di tempo è stato introdotto all'indicatore di preprocesso al compilatore.

Ad esempio #define PI 3.141è nel codice sorgente. Quindi verrà modificato dopo la sessione di preelaborazione. Significa che tutti i PI saranno cambiati in 3.141.

In questo modo #include <stdio.h>, le funzioni I / O standard verranno aggiunte al codice sorgente.

Se hai una macchina Linux, compila come gcc -save-temps source_code.c. E vedi gli output del compilatore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.