什么是StringCbprintf,这与一般的sprintf有什么不同?

Omk*_*ant 6 c c++ windows winapi printf

我正在阅读以前编写的代码,并找到了StringCbPrintf()函数

我在msdn网站上发现了这样的声明:

HRESULT StringCbPrintf(
  _Out_  LPTSTR pszDest,
  _In_   size_t cbDest,
  _In_   LPCTSTR pszFormat,
  _In_    ...
);
Run Code Online (Sandbox Code Playgroud)

什么是_in__out_这里?

为什么我们已经拥有它需要它sprintf()

Mr.*_*C64 8

_In__Out_(:既不_in_/_out_为你写,也__In__/__Out__有双下划线,写在一些其他的答案)是所谓的SAL注释.它们可以与使用/analyze编译器选项,并且可以帮助识别错误和喜欢与原C缓冲器和指针缓冲区溢出等问题.除了关于SAL的MSDN文档,您还可以阅读此博客文章.

有人讽刺(并且错误地)写道:

"在世界其他地方,输入是常量指针,但我想这太简单了.:)"

错过SAL 比这更强大的事实.事实上,使用SAL,您还可以指定目标缓冲区的最大大小,指示哪个参数包含目标缓冲区大小; 例如,如果您打开<strsafe.h>标题,您可以读到用于StringCbPrintfW(Unicode版本StringCbPrintf)的实际SAL注释是这样的:

STRSAFEAPI
StringCbPrintfW(
    __out_bcount(cbDest) STRSAFE_LPWSTR pszDest,
    __in size_t cbDest,
    __in __format_string STRSAFE_LPCWSTR pszFormat,
    ...)
{
    ....
Run Code Online (Sandbox Code Playgroud)

请注意__out_bcount(cbDest)应用于pszDest参数的SAL注释如何指定这是指向输出缓冲区(__out)的指针,该大小由参数表示为bytes(_bcount)cbDest.正如您所看到的,这是一个丰富的注释(比简单的" const"或"非const" 更丰富).

在我看来,如果你编写带有类似std::vectoror的强大容器类的C++代码std::string,并且知道它们自己的大小等,SAL是没用的.但SAL在带有原始指针的C-ish代码中很有用(比如几个Win32 API).

关于你问题的第二部分:

" StringCbPrintf如果我们已经拥有,为什么我们需要sprintf"

主要原因是这sprintf是一种不安全且缓冲超支的功能; 而StringCbPrintf你必须指定目标缓冲区的最大大小,这有助于防止缓冲区溢出(这是安全的敌人).