#define SDL_copyp(dst, src) \
{ SDL_COMPILE_TIME_ASSERT(SDL_copyp, sizeof (*(dst)) == sizeof (*(src))); } \
SDL_memcpy((dst), (src), sizeof(*(src)))
| dst | コピー先のオブジェクトへのポインタ. NULL不可 | |
| src | コピー元のオブジェクトへのポインタ. NULL不可 |
SDL_memcpyやSDL_memmoveはコピー元と先を考慮しないため, バグを引き起こす可能性がある. このマクロは, コピー元とコピー先の両方のオブジェクトへのポインタの型が同じサイズであることを確認することで大半のバグを避けることを目的としている. コピーしてもオーバーフローしないため, 両方のオブジェクトが同じ型であることはチェックしない.
サイズのチェックはコンパイル時に行われ, コピーするオブジェクトのサイズが異なる場合はコンパイラがエラーを発する.
このマクロは配列ではなく単一のオブジェクトのコピーを想定している.
このマクロは引数を2回評価しているように見えるが, 行っているのはsizeofの部分であり, コードの生成は行われず副作用も生じない.
このマクロはどのスレッドからも安全に呼べる.