這typedef聲明
typedef NTSTATUS (WINAPI * PFN_NTQUERYINFORMATIONFILE)(
IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PVOID FileInformation,
IN ULONG Length,
IN FILE_INFORMATION_CLASS FileInformationClass
);
引入了alias named
PFN_NTQUERYINFORMATIONFILE`對於代表一個指針與5組的參數和返回類型NTSTATUS
下起作用的類型
NTSTATUS (WINAPI *)(
IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PVOID FileInformation,
IN ULONG Length,
IN FILE_INFORMATION_CLASS FileInformationClass
);
。
現在你可以使用這個名稱的指針聲明這種類型的函數
PFN_NTQUERYINFORMATIONFILE ptr;
你可以得到相同的方式如下,看起來更加清晰
using PFN_NTQUERYINFORMATIONFILE =
NTSTATUS (WINAPI *)(
IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PVOID FileInformation,
IN ULONG Length,
IN FILE_INFORMATION_CLASS FileInformationClass
);
還要考慮以下幾個簡單的示例
#include <iostream>
int sum(int x, int y)
{
return x + y;
}
int product(int x, int y)
{
return x * y;
}
int division(int x, int y)
{
return x/y;
}
typedef int (*fp)(int, int);
int main()
{
for (fp f : { sum, product, division }) std::cout << f(10, 2) << std::endl;
}
輸出爲
12
20
5
考慮到當函數名在表達式中使用時,函數名會隱式轉換爲指向函數的指針。
因此,例如,從上面的示範程序的功能,這種說法是有效
std::cout << (***/* replace the comment with as many asterisks as you like */****sum)(10, 20) << std::endl;
所以,如果你相應的報酬在程序輸入的符號數,那麼你可以使用這一招用函數調用。
(****************************************************sum)(10, 20);
這僅受限於編譯器限制。
至於IN
和OUT
那麼它們就是微軟使用的宏,用於明確函數的每個參數是用來做什麼的,是提供輸入值還是用作輸出參數。
額外的空格,宏...你有一個IDE? –
首先讓我說'_FILE_NAME_INFORMATION'是一個保留的標識符:您不能合法使用它。其次,'IN'和'OUT'不是C++關鍵字,所以我猜測*它們只是'#define's而已,並且只用作註釋。 –
在你最後一個問題中,4.,你真的在問'struct'嗎?或者這只是一個類比,你實際上是在問函數指針嗎? – Downvoter