_Deref_和_Outptr_ sal注释

时间:2014-03-24 00:56:50

标签: c++ c annotations sal

Deref Outptr SAL注释之间有什么区别? 你何时使用不同类型的 Outptr 注释,如_Outptr_result_buffer_all_和_Outptr_result_buffer _?

1 个答案:

答案 0 :(得分:3)

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中创建一个(以null结尾的)缓冲区。缓冲区的大小可在*_PBufferSizeInBytes中找到。