_tcscpy_s(logFont.lfFaceName,strNewFontFace.GetBuffer());
这句代码没传递目标字符数组的长度,但跟进这个函数中去,发现他的确是获取了目标字符数组的长度且为正确的
求解_FUNC_PROLOGUE
errno_t __cdecl _FUNC_NAME(_CHAR *_DEST, size_t _SIZE, const _CHAR *_SRC)
{
_CHAR *p;
size_t available; /* validation section */
_VALIDATE_STRING(_DEST, _SIZE);
_VALIDATE_POINTER_RESET_STRING(_SRC, _DEST, _SIZE); p = _DEST;
available = _SIZE;
while ((*p++ = *_SRC++) != 0 && --available > 0)
{
} if (available == 0)
{
_RESET_STRING(_DEST, _SIZE);
_RETURN_BUFFER_TOO_SMALL(_DEST, _SIZE);
}
_FILL_STRING(_DEST, _SIZE, _SIZE - available + 1);
_RETURN_NO_ERROR;
}
那个变量availabe确实是等于32,他是怎么得道的?
这句代码没传递目标字符数组的长度,但跟进这个函数中去,发现他的确是获取了目标字符数组的长度且为正确的
求解_FUNC_PROLOGUE
errno_t __cdecl _FUNC_NAME(_CHAR *_DEST, size_t _SIZE, const _CHAR *_SRC)
{
_CHAR *p;
size_t available; /* validation section */
_VALIDATE_STRING(_DEST, _SIZE);
_VALIDATE_POINTER_RESET_STRING(_SRC, _DEST, _SIZE); p = _DEST;
available = _SIZE;
while ((*p++ = *_SRC++) != 0 && --available > 0)
{
} if (available == 0)
{
_RESET_STRING(_DEST, _SIZE);
_RETURN_BUFFER_TOO_SMALL(_DEST, _SIZE);
}
_FILL_STRING(_DEST, _SIZE, _SIZE - available + 1);
_RETURN_NO_ERROR;
}
那个变量availabe确实是等于32,他是怎么得道的?
有些东西是编译为二进制直接包含在lib里的。
这个需要跟踪一下看反编译的汇编,不过推测这个应该里使用编译器内部计算字符串大小,配合堆管理函数得到的吧。
lfFaceName正好又是数组, 因此参数中已经包含了大小typedef struct tagLOGFONT {
……
TCHAR lfFaceName[LF_FACESIZE];
} LOGFONT, *PLOGFONT; errno_t strcpy_s(
char *strDestination,
size_t numberOfElements,
const char *strSource
);
errno_t wcscpy_s(
wchar_t *strDestination,
size_t numberOfElements,
const wchar_t *strSource
);
errno_t _mbscpy_s(
unsigned char *strDestination,
size_t numberOfElements,
const unsigned char *strSource
);
template <size_t size>
errno_t strcpy_s(
char (&strDestination)[size],
const char *strSource
); // C++ only
template <size_t size>
errno_t wcscpy_s(
wchar_t (&strDestination)[size],
const wchar_t *strSource
); // C++ only
template <size_t size>
errno_t _mbscpy_s(
unsigned char (&strDestination)[size],
const unsigned char *strSource
); // C++ only
如果编译器不能推导,则你那样编译不过。至于如何做到的,就是牛逼的模板,可看源码。