printf( ) 実態はどこにあります?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
えいえい
記事: 13
登録日時: 7年前

printf( ) 実態はどこにあります?

#1

投稿記事 by えいえい » 7年前

初歩中の初歩だと思いますが、grepしてもprintf( )の実態が見つからないです。 stdio.h の extern int printf( )なら見つかりますが。。。
なんか他の標準関数などもみつからないような感じで調べ方がおかしいのでしょうか?
環境はubuntuです。

box
記事: 2002
登録日時: 13年前

Re: printf( ) 実態はどこにあります?

#2

投稿記事 by box » 7年前

printf()に限らず、標準関数のソースコードは見えません。
それらを使う側から見えるのは、ヘッダーに書いてあるプロトタイプ宣言だけです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

えいえい
記事: 13
登録日時: 7年前

Re: printf( ) 実態はどこにあります?

#3

投稿記事 by えいえい » 7年前

boxさんありがとうございます。
見えないようにしているのは何ででしょうか?
実態はどこに隠れていると考えられるのでしょうか?
見えると何か困ることがあるのでしょうか?
などすみません、変な質問ばかりでご教授お願いします。

box
記事: 2002
登録日時: 13年前

Re: printf( ) 実態はどこにあります?

#4

投稿記事 by box » 7年前

ソースコードを見せてしまうと、それを元に改変できるわけですね。
そうすると、本来の標準関数の動きとは異なる、なんちゃって標準関数(名前は同じだけど動きが微妙に異なっていたりする)が
世の中にあふれかえってしまうおそれがあるわけです。

標準関数の仕様は規定でガッチリ固まっていますので、なんちゃってが存在しては困るのです。
よって、コンパイラーを作っている企業や個人は、ソースコードを外部にさらすのではなく、
各々の標準関数のソースコード(何という言語で書いているかも我々にはわからない)をコンパイルしてできた
オブジェクトコードを束ねた標準関数ライブラリーという形で公開しています。

私たちが作成するプログラムで標準関数を使おうとすると、コンパイルの次に行なうリンクという工程において
標準関数ライブラリーをくっつけた形で実行ファイルができあがります。

おおよそのところはこういうことだと思いますが、間違っていたら、ここの掲示板にいらっしゃる
えらい方々から訂正が入るはずです。たぶん、そういう訂正の方が正しいでしょう。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: printf( ) 実態はどこにあります?

#5

投稿記事 by みけCAT » 7年前

box さんが書きました:標準関数の仕様は規定でガッチリ固まっていますので、なんちゃってが存在しては困るのです。
よって、コンパイラーを作っている企業や個人は、ソースコードを外部にさらすのではなく、
コンパイルしてできたオブジェクトコードを束ねたライブラリーという形で公開しています。
printfを含むライブラリの一つであるThe GNU C Libraryは、ソースコードが公開されています。
バージョン2.23においては、stdio-common/vfprintf.cにprintf系の関数から使われそうなvfprintfの定義があり、
多分同じディレクトリのprintf-parse.cなどで定義されている関数を呼び出していると思います。
(複雑そうなので軽く見てみただけです)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

えいえい
記事: 13
登録日時: 7年前

Re: printf( ) 実態はどこにあります?

#6

投稿記事 by えいえい » 7年前

boxさんありがとうございます。
実態は見えないようにわざとしているだと認識しました。ただ、、

>私たちが作成するプログラムで標準関数を使おうとすると、コンパイルの次に行なうリンクという工程において
>標準関数ライブラリーをくっつけた形で実行ファイルができあがります。

とboxさんはおっしゃられますが、リンクの工程で標準ライブラリをくっつけているところが見れる(記録)ような
方法はあるのでしょうか?

box
記事: 2002
登録日時: 13年前

Re: printf( ) 実態はどこにあります?

#7

投稿記事 by box » 7年前

ああ。GNUは見えるか…。
えいえい さんが書きました: とboxさんはおっしゃられますが、リンクの工程で標準ライブラリをくっつけているところが見れる(記録)ような
方法はあるのでしょうか?
コンパイラーによっては、コンパイル時のオプションで設定できるような気がします。できないかもしれません。
リンク時にライブラリーをくっつけるっていっても、あれですよ、単に
-l何とか
とかいう文字が見えるだけで(たぶん)、物理的にくっつけている場面が見えるわけではないですよ(たぶん)。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: printf( ) 実態はどこにあります?

#8

投稿記事 by YuO » 7年前

linux環境下だと,libc.soあたりを実行時リンクしていることが多いかと。
windows環境下にはそのような共有ライブラリが標準で存在しないので,VC++の再頒布可能ライブラリ中のDLLへのリンクを用意したり,実行プログラムに直接リンクしたりします。

閉鎖

“C言語何でも質問掲示板” へ戻る