sprintf_s()のオーバーロード
sprintf_s()に限った話ではないとは思うが、今回はこの関数で
発生したので例に挙げてみた。
char buff[8];
sprintf_s( buff, ......);
だと、sprintf_s()の解釈は
int sprintf_s<size_t _Size>(char (&) _Dest[_size], const char * _Format, ...)
がオーバーロードされる。
ここで、buffを関数の引数にして
void func( char *buff )
{
sprintf_s( buff, ......);
}
だと、sprintf_s()の解釈は
int sprintf_s( char * _DstBuff, size_t _SizeInBytes, const char * _Format, ...)
がオーバーロードされる。
この解釈の差は何なんだろうか…?
sprintf_sのヘルプを見てみるとそもそもこの関数は格納バッファのサイズを指定するのがデフォルトとなっていて、オーバーロードによってサイズの引数を指定しなくてもいいようになっているらしい。これはセキュリティ保護されたテンプレートのオーバーロードによって実装されているようだが、ここら辺を追っていけば原因が分かるっぽい。っていうか、常にサイズ指定すればこんなこともないんだけども…。
|