私はstdio.hで、この行を見つけました。この「のextern」キーワードに基づいてc標準ライブラリでstdinはどこに定義されていますか?
extern struct _IO_FILE *stdin;
、私はこれは単なる宣言であると仮定します。私はstdinがどこに定義され、初期化されているのだろうか?
私はstdio.hで、この行を見つけました。この「のextern」キーワードに基づいてc標準ライブラリでstdinはどこに定義されていますか?
extern struct _IO_FILE *stdin;
、私はこれは単なる宣言であると仮定します。私はstdinがどこに定義され、初期化されているのだろうか?
これは、Cライブラリのソースコードで定義されています。通常、コンパイルにはヘッダのみが必要ですが、(glibcのような)多くのオープンソース標準ライブラリのソースコードを見つけることができます。 glibcので
、それがこのようなとしてlibio/stdio.c
で定義されています:DEF_STDFILE
マクロの定義は依存して変化
DEF_STDFILE(_IO_2_1_stdin_, 0, 0, _IO_NO_WRITES);
:順番にある
_IO_FILE *stdin = (FILE *) &_IO_2_1_stdin_;
は次のようにlibio/stdfiles.c
でマクロを使用して定義いくつかは、ファイルディスクリプタ0
(これはUnixでは標準入力)を使用して、適切なFILE
構造体を設定します。
この定義は、あなたのCライブラリによって、また確かにプラットフォームによって異なる場合があります。必要に応じて、標準ライブラリのI/Oコンポーネントのさまざまな部分についてガチョウの追跡を続けることができます。
標準ライブラリコードでは、else?ここのLinuxマシンでは、libc.a:stdio.o
にあり、nm -o /usr/lib/libc.a | grep stdin | grep D
を使用しています。コードを読みたい場合は、GNU C Libraryを参照してください。
は、私はあなたがそれを見つけると、実装に依存することになる(GNUベースのシステム上で)libc
ににコンパイルされstdio.c
定義に定義されています信じています。 OSX 10.6では、stdio.hでFILE(構造体)として定義されています。
stdinは_IO_FILE型です。構造体はstdio.hのどこかにはっきりと定義されています。そうでない場合は、stdio.hに含まれるヘッダーファイルで_IO_FILEの定義をチェックインしてください。
いいえ、それは*宣言です*。 *定義*はCライブラリのソースコードにあります。 –
私は従いません。私のシステムでは、すべてのメンバーが指定されているstdio.hの132-163行目でFILEが定義されているようです。それは構造体の定義を構成しませんか? – bcr
@bcr:struct * type *を定義します。 *オブジェクト* 'stdin'は定義しません。 –
C標準では、stdin
がstdio.h
で定義されたマクロであることが明示されています。それ以外の場所では定義することはできません。
C11 7.21.1
"ヘッダ
<stdio.h>
は、いくつかのマクロを定義し、..."/-/-/
/"マクロは...です" stderrの
標準入力
標準出力これらはそれぞれ、FILEオブジェクトへのポインター型のポインタ 'FILEへのポインタ'です。 は標準エラー、入力、および出力ストリームにそれぞれ関連付けられています。
このマクロはもちろん、 "stdio.c"やコンパイラライブラリの中のどこかに実装されている実装の詳細を指すことができます。
なぜこれがダウン表示されますか? – Alan