“_inout”参数可以是 "const" “吗?

can an "_inout" parameter be "const" "?

我的理解是,如果一个指针指向可读写的东西,即“inout”,那么根据定义,它不能是“const”(因为"out") 但是,C headers 中有一些原型将参数指定为“inout const”,这对我来说没有意义。例如:

EXTERN_C _Check_return_ NTSTATUS APIENTRY D3DKMTEnumAdapters2(_Inout_ CONST D3DKMT_ENUMADAPTERS2*);

正如我上面提到的,鉴于参数也是“out”,我看不出参数怎么会是“const”。

我是不是误解了什么或者这个定义不正确?

感谢您的帮助。

`

理论上,当参数是指向结构的指针时,没有什么可以阻止声明为 _Inout_ 的参数具有 const 限定符。

例如,调用D3DKMTEnumAdapters2的参数是一个指向D3DKMT_ENUMADAPTERS2结构的指针,其定义如下:

typedef struct _D3DKMT_ENUMADAPTERS2 {
  ULONG              NumAdapters;
  D3DKMT_ADAPTERINFO *pAdapters;
} D3DKMT_ENUMADAPTERS2;

现在,如果 pAdapters 成员是 pre-allocated 个 D3DKMT_ADAPTERINFO 对象数组(大小在 NumAdapters 成员中指定),并且 所有函数所做的都是用每个适配器的相关信息填充该数据数组,然后传递的结构本身不会被修改——所以没有冲突参数上的 const 限定符。

但是,从 documentation for D3DKMTEnumAdapters2 看来,NumAdapers 成员本身也发生了变化(可能):

When D3DKMT_ENUMADAPTERS2::pAdapters is null, D3DKMT_ENUMADAPTERS2::NumAdapters is set to the maximum supported adapter count. Callees will commonly invoke the method, first, to retrieve the maximum supported adapter count.

因此,根据该段,当使用传递的 pAdapters 成员的 NULL 值调用函数时,将违反 const 属性(pointed-to) 结构。


请注意,链接文档还暗示 NumAdapters 成员已修改,即使给出了 non-null pAdapters 值(强调我的):

Caller passes in array size and empty array space. Callee verifies enough room in the array, fills out array, and passes back how much of the array was used.