_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,他是怎么得道的?

解决方案 »

  1.   

    VC并没有附带MS的C库完整源代码。
    有些东西是编译为二进制直接包含在lib里的。
    这个需要跟踪一下看反编译的汇编,不过推测这个应该里使用编译器内部计算字符串大小,配合堆管理函数得到的吧。
      

  2.   

    看MSDN对 _tcstrcpy_s的函数模板声明 
    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
      

  3.   

    编译器能推导你的logFont.lfFaceName的长度(所以它一定是个定长的)。
    如果编译器不能推导,则你那样编译不过。至于如何做到的,就是牛逼的模板,可看源码。
      

  4.   

    这是神马用法,template<>里面应该用class A这样的,他的sizeof 是神马个原理?