解释这个复杂的typedef

时间:2016-08-26 10:38:01

标签: c++ winapi

那么这个typedef语法实际上做了什么?

typedef PIMAGE_NT_HEADERS (WINAPI *CHECKSUMMAPPEDFILE)
          (PVOID baseAddress, DWORD fileLength, PDWORD headerSum, PDWORD checkSum);

据我所知,typedef的使用方式与此typedef oldtype newtype类似; 但整个事情看起来像一个函数的原型,但它看起来也像是在创建一种新类型的PIMAGE_NT_HEADERS ......

正如有人回应"函数typedef"但函数typedef的一个例子可以再见

typedef int multiply(int arg1, int arg2);

其中multiply是函数名称,但在我上面发布的复杂函数名称中,函数名称在哪里?

2 个答案:

答案 0 :(得分:2)

您的typedef创建了别名CHECKSUMMAPPEDFILECHECKSUMMAPPEDFILE是一个指向函数的指针,该函数返回PIMAGE_NT_HEADERS并将其作为参数PVOID baseAddress, DWORD fileLength, PDWORD headerSum, PDWORD checkSum。从第一次看这种typedef的语法并不明显。

WINAPIcalling convention

答案 1 :(得分:1)

这是函数指针的类型别名。您可以使用它来定义可以为其分配函数的变量。

此:

typedef int multiply(int arg1, int arg2);

是函数类型的typedef,不能像函数指针一样使用它。见下面的例子:

int mul(int arg1, int arg2) {
}

typedef int multiply(int arg1, int arg2);
int main() {
    //multiply m = mul; // error multiply is a typedef for a funciton type
    multiply* m = mul; // ok
}

您的类型别名:

typedef PIMAGE_NT_HEADERS (WINAPI *CHECKSUMMAPPEDFILE)(PVOID baseAddress,   
                               DWORD fileLength, PDWORD headerSum, PDWORD checkSum);

做的:

  

它声明一个CHECKSUMMAPPEDFILE作为函数的指针(PVOID,DWORD,PDWORD,PDWORD),WINAPI调用约定返回PIMAGE_NT_HEADERS

您可以使用cdecl.org来设置decifer函数指针,它需要进行一些调整才能使其正常工作。