配列を関数の引数にする場合の便利なワザ (C++ のみ)
C/C++言語で配列を関数に渡す際、その長さは関数側では知ることができません。なので配列の先頭要素へのポインターとそのサイズを渡します。
extern void func(char *array, size_t size);
void foo(void)
{
char array[100];
func(array, sizeof (array));
}
これが当たり前だと思っていました。
ところが今日 Microsft の sprintf_s を使ったコードを見ていたら サイズを指定している第2引数が無いコードとあるコードが両方存在していて?と思い調べてみました。
sprintf_s は template での実装が存在し配列の参照を使うことで安全に配列を扱えるようになっているようです。
先ほどの例ですと
template <size_t size> void func(char (&array)[size]);
void foo(void)
{
char array[100];
func(array):
}
の様になるみたいです。
これはなるほど!の機能ですね。
今度何か作るときに使ってみようと思います。
extern void func(char *array, size_t size);
void foo(void)
{
char array[100];
func(array, sizeof (array));
}
これが当たり前だと思っていました。
ところが今日 Microsft の sprintf_s を使ったコードを見ていたら サイズを指定している第2引数が無いコードとあるコードが両方存在していて?と思い調べてみました。
sprintf_s は template での実装が存在し配列の参照を使うことで安全に配列を扱えるようになっているようです。
先ほどの例ですと
template <size_t size> void func(char (&array)[size]);
void foo(void)
{
char array[100];
func(array):
}
の様になるみたいです。
これはなるほど!の機能ですね。
今度何か作るときに使ってみようと思います。
コメント
コメントを投稿