12

「_」の意味は?Microsoft が最初にこのマークを追加するのはなぜですか?

4

4 に答える 4

19

で始まるグローバル名前空間の識別子は_、実装用に予約されています。_snprintf実装 (Visual Studio) が提供する関数にすぎません。その理由については、Visual Studio は C89 を実装しておりsnprintf、後の C99 標準の一部です。

それに加えて、両方の関数のセマンティクスは戻り値の型が異なります。これsnprintfは常に、フォーマットされた文字列が取る文字数です (バッファーに十分なスペースがあるかどうかに関係なく、ない場合は負の数_snprintfを返します)。バッファに十分なスペース。

つまり、出力に十分な大きさのバッファーを割り当てるには、次のようにします。

int size = snprintf( 0, 0, "%s %d\n", str, i );
char * buffer = malloc( size+1 );
snprintf( buffer, size+1, "%s %d\n", str, i );

_snprintf関数が返す唯一の情報は、現在のサイズが十分でないということであるため、これを行うことはできません。

于 2012-07-20T12:30:06.013 に答える
12

snprintf()Microsoft の C ランタイムがサポートを開始した時点では、まだ標準の一部ではありませんでした。

関数プロトタイプは標準化されておらず、開発者はその名前を使用したくなかったためsnprintf(後で標準が別のプロトタイプを指定した場合に備えて)、関数が Microsoft の標準拡張機能であることを示すために先頭にアンダースコアを追加することにしました。

于 2012-07-20T12:22:43.557 に答える
1

バッファーが不十分な場合の戻り値の違い (David の回答で説明) を除けば、グループの関数は別の重要な点で_sn...標準とは異なります。snprintfターゲット バッファが1 文字だけ短すぎる場合、_sn...関数はこの状況を「成功」と見なします。

より詳細には、ターゲット バッファーが結果のシーケンス全体を格納するのに十分な長さであるが、終端のゼロ文字がない場合、_sn...関数は結果を切り捨てず、終端のゼロをターゲット バッファーに書き込まず、バッファーのサイズを次のように返します。結果。そのため、一般に、結果がゼロで終了することは保証されません。

同じ状況snprintfで、結果のシーケンスの最後の文字を破棄し、その場所にゼロ ターミネータを書き込みます。の結果snprintfは常にゼロで終了します。

于 2018-01-21T03:01:56.940 に答える