My understanding is that if a pointer points to something that is read and written, that is, "inout" then, by definition it cannot be "const" (because of "out") yet, there are prototypes in the C headers that specify parameters as "inout const" which doesn't make sense to me. For intance:
EXTERN_C _Check_return_ NTSTATUS APIENTRY D3DKMTEnumAdapters2(_Inout_ CONST D3DKMT_ENUMADAPTERS2*);
As I mentioned above, I don't see how the parameter can be "const" given that it's also "out".
Am I misunderstanding something or is that definition incorrect ?
Thank you for your help.
`
CodePudding user response:
In theory, there is nothing to prevent an argument declared as _Inout_
having the const
qualifier, when that argument is a pointer to a structure.
For instance, the argument in the call to D3DKMTEnumAdapters2
is a pointer to a D3DKMT_ENUMADAPTERS2
structure, which is defined as follows:
typedef struct _D3DKMT_ENUMADAPTERS2 {
ULONG NumAdapters;
D3DKMT_ADAPTERINFO *pAdapters;
} D3DKMT_ENUMADAPTERS2;
Now, if the pAdapters
member were a pre-allocated array of D3DKMT_ADAPTERINFO
objects (of size specified in the NumAdapters
member), and all the function did was to fill that data array with the relevant information for each adapter, then the passed structure itself would not have been modified – so there is no conflict with the const
qualifier on the argument.
However, from the documentation for D3DKMTEnumAdapters2
, it appears that the NumAdapers
member itself is also changed (potentially):
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.
Thus, according to that paragraph, the const
attribute will be violated when the function is called with a NULL
value for the pAdapters
member of the passed (pointed-to) structure.
Note that the linked documentation also implies that the NumAdapters
member is modified, even when a non-null pAdapters
value is given (emphasis mine):
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.