在第一次使用时strcpy_s
,数组中元素的数量szTemp
是类型的一部分szTemp
(因为它是一个“512的数组TCHAR
”),所以编译器知道它并可以完成声明的模板strcpy_s
。
在第二种用法中strcpy_s
, ,pszTemp
是一个指针(它是一个“指向 ” 的指针TCHAR
),而不是一个数组,指向的元素数量不是类型的一部分。通常,编译器无法知道指针指向的位置有多少元素。(在这种情况下,编译器可能会推导出它,因为前面的代码显示了它,但这增加了编译器和通常被认为不值得实现的语言的复杂性。)
要自己执行此操作,请按照声明的方式声明模板strcpy_s
:
template <size_t size> errno_t strcpy_s(
char (&strDestination)[size],
const char *strSource
);
这声明了一个基于 parameter的模板,该模板用于一个函数,其第一个参数的类型为“引用元素size
数组”。当编译器看到第一个参数是 char 的 512 个元素的数组的使用时,它能够将此参数与模板中的参数相匹配,并推断为 512。size
char
strcpy_s
size
在其他地方,您将拥有模板的定义(不仅仅是声明)。size
该定义可以在其代码中使用模板参数。当编译器看到 的使用时strcpy_s
,它将以size
512 的特化实例化模板定义。
这仅适用于 C++,不适用于 C,因为 C 没有模板。