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);