“_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.
我的理解是,如果一个指针指向可读写的东西,即“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.