4

GLibC を完全にはサポートしていない別のプラットフォームに snprintf() を移植する必要があります。

Glibc 2.14 ソース コードの基になる宣言を探しています。多くの関数呼び出しに従いますが、vfprintf() でスタックします。その後、_IO_vfprintf() を呼び出しているようですが、定義が見つかりません。おそらくマクロが物事を難読化しています。

フォーマット文字列をスキャンし、入力バッファが十分に大きい場合に書き込むバイト数を計算する実際の C コードを確認する必要があります。

newlib 1.19.0 も調べてみましたが、_svfprintf_r() で行き詰まりました。どこにも定義が見つかりません。

snprintf() の定義または別の定義を教えてもらえますか?

4

3 に答える 3

6

_svfprintf_r()Newlibで(そして友達の)定義を見つけるためにソースを掘り下げるのにかなりの時間を費やしました。OPがそれについて尋ねたので、私はそれらを必要とする貧しい魂のために私の発見を投稿します。以下はNewlib1.20.0にも当てはまりますが、バージョンが異なればほぼ同じだと思います。

実際のソースはvfprintf.cファイルにあります。、、、、または(ビルドオプションに応じて)のいずれかに設定されたマクロがあり、実際の実装関数はそれに応じて定義され_VFPRINTF_Rます。_svfiprintf_r_vfiprintf_r_svfprintf_r_vfprintf_r

int
_DEFUN(_VFPRINTF_R, (data, fp, fmt0, ap),
       struct _reent *data _AND
       FILE * fp           _AND
       _CONST char *fmt0   _AND
       va_list ap)
{
    ...
于 2013-03-01T11:49:06.393 に答える
4

http://www.ijs.si/software/snprintf/には、vsnprintf.c、asnprintf、vasnprintf、asprintf、vasprintfなどのsnprintfのポータブル実装であると彼らが主張しているものがあります。おそらくそれは役立つことができます。

于 2011-06-15T10:42:03.213 に答える
4

GNU C ライブラリ (glibc) のソース コードは、sourceware.orgでホストされています。

vfprintf()によって呼び出されるの実装へのリンクは次のsnprintf()とおりです: https://sourceware.org/git/?p=glibc.git;a=blob;f=stdio-common/vfprintf.c

于 2016-03-28T14:17:51.537 に答える