Où stdin est-il défini dans la bibliothèque standard c?

J’ai trouvé cette ligne dans stdio.h:

extern struct _IO_FILE *stdin; 

Basé sur ce mot clé ‘extern’, je suppose que ceci est juste une déclaration. Je me demande où est stdin défini et initialisé?

Il est défini dans le code source de votre bibliothèque C. Généralement, vous n’avez besoin que des en-têtes pour la compilation, mais vous pouvez trouver le code source de nombreuses bibliothèques standard à code source ouvert (comme glibc).

Dans la glibc, libio/stdio.c comme libio/stdio.c :

 _IO_FILE *stdin = (FILE *) &_IO_2_1_stdin_; 

Ce qui est à son tour défini en utilisant une macro dans libio/stdfiles.c comme ceci:

 DEF_STDFILE(_IO_2_1_stdin_, 0, 0, _IO_NO_WRITES); 

La définition de la macro DEF_STDFILE varie en fonction de quelques éléments, mais elle configure plus ou moins une structure FILE appropriée à l’aide du descripteur de fichier 0 (qui est une entrée standard sous Unix).

La définition peut (et bien sûr varie) en fonction de votre bibliothèque C, et certainement selon la plate-forme. Si vous le souhaitez, vous pouvez poursuivre la chasse à l’oie autour des différentes parties du composant d’E / S de votre bibliothèque standard.

Je crois que c’est défini dans stdio.c qui est compilé dans libc (sur des systèmes basés sur gnu)

La définition dépendra de la mise en oeuvre, ainsi que de la localisation Pour moi, sous OSX 10.6, il est défini dans stdio.h, en tant que FILE (une structure).

stdin est du type _IO_FILE, une structure clairement définie quelque part, probablement dans stdio.h. Sinon, vérifiez dans les fichiers d’en-tête inclus dans stdio.h la définition de _IO_FILE.

Dans le code de bibliothèque standard, où d’autre? Dans une machine Linux ici, c’est dans libc.a:stdio.o , trouvé en utilisant nm -o /usr/lib/libc.a | grep stdin | grep D nm -o /usr/lib/libc.a | grep stdin | grep D nm -o /usr/lib/libc.a | grep stdin | grep D Si vous voulez lire du code, consultez la bibliothèque GNU C.

La norme C stipule explicitement que stdin est une macro définie dans stdio.h . Il n’est pas autorisé à être défini ailleurs.

C11 7.21.1

“L’en-tête définit plusieurs macros, …” / – /

“Les macros sont …” / – /

stderr
stdin
stdout

qui sont des expressions de type ” pointeur sur FILE ” qui pointent sur les objects FILE associés respectivement aux stream d’erreur, d’entrée et de sortie standard.

Cette macro peut bien sûr pointer sur des détails d’implémentation qui sont implémentés ailleurs, comme dans un “stdio.c” ou ce que la bibliothèque du compilateur a choisi de mettre.