Pourquoi tous les fichiers C écrits par mon professeur commencent-ils par un seul # sur la première ligne?

431

Je passe par quelques notes de cours C, et chaque fichier source du programme C commence par un seul #sur la première ligne du programme.

Ensuite, il y a des lignes vides, et après ces autres éléments, suivis de la mainfonction.

Quelle est la raison du #?

(Il est hors limite maintenant et je ne peux pas vraiment demander au gars.)

Voici un exemple:

#

#include <stdio.h>
int main() {
   printf("Hello, World!");
   return 0;
}
L'homme principal
la source
3
Je mets le premier exemple dans les notes de cours. Il y a littéralement le #, puis une ligne vierge, puis le programme.
The Main Man
30
Le but principal du vide #est l'obscurcissement. Si vous voulez confondre tout le monde, vous pouvez par exemple démarrer tous vos fichiers source avec la ligne #//#BEGIN#\\#(qui ne fait absolument rien).
Lundin
3
@Bathsheba C'est probablement l'une de ces personnes cl.cam.ac.uk/people/academic.html
TylerH
7
@Bathsheba Les horodatages de ce dernier montrent que vous avez donné une réponse raisonnablement détaillée une minute seulement après la question, accompagnée d'une citation pertinente de la norme de référence C99. Vous êtes définitivement un complot. Peut-être dans les Illuminati. Comment les deux questions ont-elles fini par être si populaires?
Nat

Réponses:

614

Wow, cette exigence va rebrousserez chemin dans les années 1970.

Au tout début du C pré-standardisé, si vous vouliez invoquer le préprocesseur , vous deviez écrire un #comme première chose dans la première ligne d'un fichier source. L'écriture un seul# en haut du fichier offre une flexibilité dans le placement des autres directives de préprocesseur.

D'après un brouillon original en C du grand Dennis Ritchie lui-même - :

12. Lignes de commande du compilateur

[...] Pour provoquer l'appel du [pré] processeur, il est nécessaire que la toute première ligne du programme commence par #. Étant donné que les lignes nulles sont ignorées par le préprocesseur, cette ligne ne doit contenir aucune autre information.

Ce document permet une excellente lecture (et m'a permis de sauter sur cette question comme un chat fou).

Je soupçonne que le conférencier est simplement sentimental - cela n'a pas été requis depuis ANSI C.

Bathsheba
la source
22
Si je comprends bien, l'exigence n'est pas que le tout premier caractère doit être un #sur une ligne en soi, juste qu'il commence par un #, alors pourquoi ne pas aller directement pour un #include? Ou est-ce que je comprends mal?
Federico klez Culloca
14
@Bathsheba " Pour provoquer l'invocation de ce préprocesseur, il est nécessaire que la toute première ligne du programme commence par #. Comme les lignes nulles sont ignorées par le préprocesseur, cette ligne ne doit contenir aucune autre information. " <- donc il peut déjà contenir une directive de préprocesseur, mais ce n'est pas nécessaire ....
5
Ce n'était pas obligatoire lorsque j'ai commencé à programmer en C (1980). ANSI C n'a été standardisé qu'en 1989.
pojo-guy
29
@ federico-klez-culloca S'il devient une inclusion, le fichier peut se retrouver sans # de début car à l'avenir, quelqu'un supprimera une inclusion inutile sans se rendre compte des effets secondaires de la première.
Fadeway
4
@Casanova - Non. Faire cela et accepter une telle réponse contrevient aux règles du site. Demander et répondre sous différents comptes est contraire à l'esprit des règles du site même sans vote mutuel, si vous comprenez bien. Il n'y a aucun mal à répondre à votre propre question et à accepter cette réponse avec le même compte - je l'ai fait dans le passé.
Bathsheba
1

Ne fait rien

Selon la norme ISO de C / C ++:

Une directive de prétraitement du formulaire

# new-line

n'a aucun effet.

Donc, dans les compilateurs d'aujourd'hui, ce hachage vide ne fait rien (comme - new-line ;n'a aucune fonctionnalité).


PS : en C pré-standardisé , # new-lineavait un rôle important, il était utilisé pour invoquer le pré-processeur C (comme souligné par @Bathsheba). Ainsi, le code ici a été écrit pendant cette période ou provenait de l'habitude.

Minhas Kamal
la source
-5

Vous devez connaître le processus de compilation de C. Parce que c'est "doit savoir" comment le code source se convertit en code binaire exécutable (fichier).

À partir du processus de compilation, le code source C doit traverser la section du pré-processeur. Mais comment dire au compilateur de prétraiter le code? ... Que le symbole de temps # a été introduit dans l'indicateur de prétraitement du compilateur.

Par exemple, #define PI 3.141est dans le code source. Il sera ensuite modifié après la session de prétraitement. Autrement dit, tous les PI seront changés en 3.141.

De cette façon #include <stdio.h>, les fonctions d'E / S standard seront ajoutées à votre code source.

Si vous avez une machine Linux, compilez comme gcc -save-temps source_code.c. Et voyez les sorties du compilateur.

GOBI
la source