2011-08-02 56 views

答えて

8

これは、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コンポーネントのさまざまな部分についてガチョウの追跡を続けることができます。

0

標準ライブラリコードでは、else?ここのLinuxマシンでは、libc.a:stdio.oにあり、nm -o /usr/lib/libc.a | grep stdin | grep Dを使用しています。コードを読みたい場合は、GNU C Libraryを参照してください。

0

は、私はあなたがそれを見つけると、実装に依存することになる(GNUベースのシステム上で)libcににコンパイルされstdio.c

+2

なぜこれがダウン表示されますか? – Alan

0

定義に定義されています信じています。 OSX 10.6では、stdio.hでFILE(構造体)として定義されています。

stdinは_IO_FILE型です。構造体はstdio.hのどこかにはっきりと定義されています。そうでない場合は、stdio.hに含まれるヘッダーファイルで_IO_FILEの定義をチェックインしてください。

+2

いいえ、それは*宣言です*。 *定義*はCライブラリのソースコードにあります。 –

+0

私は従いません。私のシステムでは、すべてのメンバーが指定されているstdio.hの132-163行目でFILEが定義されているようです。それは構造体の定義を構成しませんか? – bcr

+1

@bcr:struct * type *を定義します。 *オブジェクト* 'stdin'は定義しません。 –

0

C標準では、stdinstdio.hで定義されたマクロであることが明示されています。それ以外の場所では定義することはできません。

C11 7.21.1

"ヘッダ<stdio.h>は、いくつかのマクロを定義し、..."/-/

-/

/"マクロは...です" stderrの
標準入力
標準出力

これらはそれぞれ、FILEオブジェクトへのポインター型のポインタ 'FILEへのポインタ'です。 は標準エラー、入力、および出力ストリームにそれぞれ関連付けられています。

このマクロはもちろん、 "stdio.c"やコンパイラライブラリの中のどこかに実装されている実装の詳細を指すことができます。

関連する問題