2
int printf (const char *__format, ...)
{
  register int __retval;
  __builtin_va_list __local_argv; __builtin_va_start( __local_argv, __format );
  __retval = __mingw_vprintf( __format, __local_argv );
  __builtin_va_end( __local_argv );
  return __retval;
}

上記の行は、関数stdioに対応するライブラリの一部ですprintf。がprintf呼び出されると、これらが実行されます。これらの行はどういう意味ですか? 上記の各行が実行されるとどうなりますか?

4

1 に答える 1

6

__mingw_vprintfこれは主に、実際の作業を行う別の関数のラッパーです。ここでの唯一のコードは、可変引数リストを再パッケージ化することです。したがって、Mingw がどのようにそれを行うかを実際に確認するには、その関数とそれが呼び出す他の関数を調べる必要があります。これに本当に興味がある場合は、PJ Plauger のThe Standard C Libraryのコピーを入手してください。彼は、標準ライブラリのすべての関数を使用、作成、およびテストする方法を説明します。

一般に、ライブラリ コードはオブジェクト ファイルにコンパイルされ (コードと同様)、アーカイブ形式でパッケージ化されます。プログラムがリンクされると、必要なライブラリ オブジェクトがアーカイブから抽出され、同じ実行可能ファイルに書き込まれます。これは、静的にリンクされたライブラリ用です。

動的にリンクされたライブラリの場合、ライブラリ コード アーカイブは全体としてメモリにロードされ (通常、それを使用する必要があるプログラムによって共有されます)、プログラムはオペレーティング システムの助けを借りてライブラリ呼び出しを行い、メモリを容易にします。 -共有。

どちらの種類のライブラリでも、ヘッダー ファイルにはマクロ、型、および関数プロトタイプのみを含める必要があります。関数定義を含めないでください (ファイルに属し.cます)。

printfこれは、標準ライブラリが存在する前の古いバージョンです: link (<-- これは実際に読み取り可能です (ish))。不思議なことに、第 7 版のバージョンは、上で引用したものとよく似ています。

#include    <stdio.h>

printf(fmt, args)
char *fmt;
{
    _doprnt(fmt, &args, stdout);
    return(ferror(stdout)? EOF: 0);
}

この場合、_doprntアセンブリ言語で実装されます。

于 2013-04-07T06:16:13.493 に答える