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()?
_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你必须指定目标缓冲区的最大大小,这有助于防止缓冲区溢出(这是安全的敌人).