Microsoft "Secure Template Overloads"
http://msdn.microsoft.com/en-us/library/ms175759(VS.80).aspx
マクロが三つあって、結局のところそれぞれどれがどうなるんだ?というのがようやっと腑に落ちた。
規定で有効になっている _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES は、追加された _s 系関数に、引数を省略して呼び出せるバリアントを追加するもの。
たとえば strcpy_s を呼び出すには、バッファに格納可能な文字数を渡す必要があるけれど (たとえば strcpy_s(buf, countof(buf), "hello") のように)、これを省略した呼び出しが一部可能になる。
char buf[10]; strcpy_s(buf, "hello");
_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES と _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT は、既存の名前にバリアントを追加する。 (マクロ名のとおりオーバーロードが追加される)
以下のようなコードであれば、なんら書き換えることをしなくても (テンプレートオーバーロードにマッチするため) 安全な関数呼び出しに置き換わる。
char buf[10]; strcpy(buf, "hello"); strncpy(buf, src, src_count);
これはテンプレートの魔法で配列のサイズが取得できるから。それぞれ次のようなテンプレートのオーバーロードがあって、これらにマッチする。
template<size_t n> inline errno_t strcpy_s(char (&dst)[n], const char *src); template<size_t n> inline void strcpy(char (&dst)[n], const char *src); template<size_t n> inline void strncpy(char (&dst)[n], const char *src, size_t src_count);