Deref和Outptr SAL 注释有什么区别?此外,您何时使用不同类型的Outptr注释,如 _Outptr_result_buffer_all_ 和 _Outptr_result_buffer_?
问问题
1798 次
1 回答
4
SAL 的记录很差。您需要查看sal.h
文件。
Deref 和 Outptr SAL 注释有什么区别
它们是相同的,只是Deref注释来自 SAL 1,而Outptr来自 SAL 2(可以表达更多)。所以Deref已被弃用。
此外,您何时使用不同类型的 Outptr 注释,如 _Outptr_result_buffer_all_ 和 _Outptr_result_buffer_?
引用sal.h:
Outptr:返回的变量是指针类型(所以 param 是指针到指针类型)。被调用函数提供/分配空间。
看源码,_Outptr_result_buffer_
都_Outptr_result_buffer_all_
差不多。您提供将分配的元素数量作为参数(如果它恰好是一个元素,请使用_Outptr_
)。区别在于前者意味着元素可以被调用者写入(隐式它们也是可读的),而后者意味着元素只能读取。
查看 C 运行时源代码,仅_Outptr_result_buffer_
在极少数地方使用,例如。对于创建的缓冲区_dupenv_s
:
_Check_return_opt_ _CRTIMP errno_t __cdecl _dupenv_s(
Outptr_result_buffer_maybenull_(*_PBufferSizeInBytes) _Outptr_result_z_ char **_PBuffer,
_Out_opt_ size_t * _PBufferSizeInBytes,
_In_z_ const char * _VarName);
所以这个函数在_PBuffer
. 缓冲区的大小在 中找到*_PBufferSizeInBytes
。
于 2015-02-23T14:51:03.737 回答