「_」の意味は?Microsoft が最初にこのマークを追加するのはなぜですか?
4 に答える
で始まるグローバル名前空間の識別子は_
、実装用に予約されています。_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
関数が返す唯一の情報は、現在のサイズが十分でないということであるため、これを行うことはできません。
snprintf()
Microsoft の C ランタイムがサポートを開始した時点では、まだ標準の一部ではありませんでした。
関数プロトタイプは標準化されておらず、開発者はその名前を使用したくなかったためsnprintf
(後で標準が別のプロトタイプを指定した場合に備えて)、関数が Microsoft の標準拡張機能であることを示すために先頭にアンダースコアを追加することにしました。
バッファーが不十分な場合の戻り値の違い (David の回答で説明) を除けば、グループの関数は別の重要な点で_sn...
標準とは異なります。snprintf
ターゲット バッファが1 文字だけ短すぎる場合、_sn...
関数はこの状況を「成功」と見なします。
より詳細には、ターゲット バッファーが結果のシーケンス全体を格納するのに十分な長さであるが、終端のゼロ文字がない場合、_sn...
関数は結果を切り捨てず、終端のゼロをターゲット バッファーに書き込まず、バッファーのサイズを次のように返します。結果。そのため、一般に、結果がゼロで終了することは保証されません。
同じ状況snprintf
で、結果のシーケンスの最後の文字を破棄し、その場所にゼロ ターミネータを書き込みます。の結果snprintf
は常にゼロで終了します。