初歩中の初歩だと思いますが、grepしてもprintf( )の実態が見つからないです。 stdio.h の extern int printf( )なら見つかりますが。。。
なんか他の標準関数などもみつからないような感じで調べ方がおかしいのでしょうか?
環境はubuntuです。
printf( ) 実態はどこにあります?
Re: printf( ) 実態はどこにあります?
printf()に限らず、標準関数のソースコードは見えません。
それらを使う側から見えるのは、ヘッダーに書いてあるプロトタイプ宣言だけです。
それらを使う側から見えるのは、ヘッダーに書いてあるプロトタイプ宣言だけです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: printf( ) 実態はどこにあります?
boxさんありがとうございます。
見えないようにしているのは何ででしょうか?
実態はどこに隠れていると考えられるのでしょうか?
見えると何か困ることがあるのでしょうか?
などすみません、変な質問ばかりでご教授お願いします。
見えないようにしているのは何ででしょうか?
実態はどこに隠れていると考えられるのでしょうか?
見えると何か困ることがあるのでしょうか?
などすみません、変な質問ばかりでご教授お願いします。
Re: printf( ) 実態はどこにあります?
ソースコードを見せてしまうと、それを元に改変できるわけですね。
そうすると、本来の標準関数の動きとは異なる、なんちゃって標準関数(名前は同じだけど動きが微妙に異なっていたりする)が
世の中にあふれかえってしまうおそれがあるわけです。
標準関数の仕様は規定でガッチリ固まっていますので、なんちゃってが存在しては困るのです。
よって、コンパイラーを作っている企業や個人は、ソースコードを外部にさらすのではなく、
各々の標準関数のソースコード(何という言語で書いているかも我々にはわからない)をコンパイルしてできた
オブジェクトコードを束ねた標準関数ライブラリーという形で公開しています。
私たちが作成するプログラムで標準関数を使おうとすると、コンパイルの次に行なうリンクという工程において
標準関数ライブラリーをくっつけた形で実行ファイルができあがります。
おおよそのところはこういうことだと思いますが、間違っていたら、ここの掲示板にいらっしゃる
えらい方々から訂正が入るはずです。たぶん、そういう訂正の方が正しいでしょう。
そうすると、本来の標準関数の動きとは異なる、なんちゃって標準関数(名前は同じだけど動きが微妙に異なっていたりする)が
世の中にあふれかえってしまうおそれがあるわけです。
標準関数の仕様は規定でガッチリ固まっていますので、なんちゃってが存在しては困るのです。
よって、コンパイラーを作っている企業や個人は、ソースコードを外部にさらすのではなく、
各々の標準関数のソースコード(何という言語で書いているかも我々にはわからない)をコンパイルしてできた
オブジェクトコードを束ねた標準関数ライブラリーという形で公開しています。
私たちが作成するプログラムで標準関数を使おうとすると、コンパイルの次に行なうリンクという工程において
標準関数ライブラリーをくっつけた形で実行ファイルができあがります。
おおよそのところはこういうことだと思いますが、間違っていたら、ここの掲示板にいらっしゃる
えらい方々から訂正が入るはずです。たぶん、そういう訂正の方が正しいでしょう。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: printf( ) 実態はどこにあります?
printfを含むライブラリの一つであるThe GNU C Libraryは、ソースコードが公開されています。box さんが書きました:標準関数の仕様は規定でガッチリ固まっていますので、なんちゃってが存在しては困るのです。
よって、コンパイラーを作っている企業や個人は、ソースコードを外部にさらすのではなく、
コンパイルしてできたオブジェクトコードを束ねたライブラリーという形で公開しています。
バージョン2.23においては、stdio-common/vfprintf.cにprintf系の関数から使われそうなvfprintfの定義があり、
多分同じディレクトリのprintf-parse.cなどで定義されている関数を呼び出していると思います。
(複雑そうなので軽く見てみただけです)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: printf( ) 実態はどこにあります?
boxさんありがとうございます。
実態は見えないようにわざとしているだと認識しました。ただ、、
>私たちが作成するプログラムで標準関数を使おうとすると、コンパイルの次に行なうリンクという工程において
>標準関数ライブラリーをくっつけた形で実行ファイルができあがります。
とboxさんはおっしゃられますが、リンクの工程で標準ライブラリをくっつけているところが見れる(記録)ような
方法はあるのでしょうか?
実態は見えないようにわざとしているだと認識しました。ただ、、
>私たちが作成するプログラムで標準関数を使おうとすると、コンパイルの次に行なうリンクという工程において
>標準関数ライブラリーをくっつけた形で実行ファイルができあがります。
とboxさんはおっしゃられますが、リンクの工程で標準ライブラリをくっつけているところが見れる(記録)ような
方法はあるのでしょうか?
Re: printf( ) 実態はどこにあります?
ああ。GNUは見えるか…。
リンク時にライブラリーをくっつけるっていっても、あれですよ、単に
-l何とか
とかいう文字が見えるだけで(たぶん)、物理的にくっつけている場面が見えるわけではないですよ(たぶん)。
コンパイラーによっては、コンパイル時のオプションで設定できるような気がします。できないかもしれません。えいえい さんが書きました: とboxさんはおっしゃられますが、リンクの工程で標準ライブラリをくっつけているところが見れる(記録)ような
方法はあるのでしょうか?
リンク時にライブラリーをくっつけるっていっても、あれですよ、単に
-l何とか
とかいう文字が見えるだけで(たぶん)、物理的にくっつけている場面が見えるわけではないですよ(たぶん)。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: printf( ) 実態はどこにあります?
linux環境下だと,libc.soあたりを実行時リンクしていることが多いかと。
windows環境下にはそのような共有ライブラリが標準で存在しないので,VC++の再頒布可能ライブラリ中のDLLへのリンクを用意したり,実行プログラムに直接リンクしたりします。
windows環境下にはそのような共有ライブラリが標準で存在しないので,VC++の再頒布可能ライブラリ中のDLLへのリンクを用意したり,実行プログラムに直接リンクしたりします。