2

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

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

正如我上面提到的,我看不出参数如何是“const”,因为它也是“out”。

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

谢谢您的帮助。

`

4

1 回答 1

2

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

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

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

现在,如果pAdapters成员是一个预先分配的D3DKMT_ADAPTERINFO对象数组(成员中指定的大小NumAdapters),并且所有函数所做的只是用每个适配器的相关信息填充该数据数组,那么传递的结构本身就不会被修改 - 因此与const参数上的限定符没有冲突。

但是,从 的文档D3DKMTEnumAdapters2NumAdapers来看,成员本身似乎也发生了变化(可能):

当 D3DKMT_ENUMADAPTERS2::pAdapters 为空时,D3DKMT_ENUMADAPTERS2::NumAdapters 设置为支持的最大适配器计数。被调用者通常会首先调用该方法来检索最大支持的适配器计数。

因此,根据该段,当使用传递(指向)结构的成员的值const调用函数时,将违反该属性。NULLpAdapters


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

调用者传入数组大小和空数组空间。被调用者验证数组中有足够的空间,填写数组,并传回数组的使用量

于 2022-02-22T13:50:55.293 回答