我的理解是,如果一個指標指向某個被讀寫的東西,即“ inout ”,那么根據定義它不能是“const”(因為“out”),C 頭檔案中有指定的原型引數為“ inout const”,這對我來說沒有意義。例如:
EXTERN_C _Check_return_ NTSTATUS APIENTRY D3DKMTEnumAdapters2(_Inout_ CONST D3DKMT_ENUMADAPTERS2*);
正如我上面提到的,我看不出引數如何是“const”,因為它也是“out”。
我是誤解了什么還是這個定義不正確?
謝謝您的幫助。
`
uj5u.com熱心網友回復:
理論上,當引數是指向結構的指標時,沒有什么可以阻止宣告為_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給出了非空值(強調我的):
呼叫者傳入陣列大小和空陣列空間。被呼叫者驗證陣列中有足夠的空間,填寫陣列,并傳回陣列的使用量。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/431182.html
上一篇:realloc表示無效指標,除非無關的for回圈被注釋掉
下一篇:如何在字符陣列中附加部分字串?
