gpt4 book ai didi

c - __cdecl 在 C 函数参数中的用途是什么

转载 作者:太空宇宙 更新时间:2023-11-04 07:54:48 24 4
gpt4 key购买 nike

我正在学习C语言,在学习的过程中我发现了一行代码,这对我来说是全新的和陌生的void PullDown(char **, int, void (__cdecl **)(void));我只知道第一个和第二个参数。我想知道第三个参数。__cdecl 之后的两个星号有什么用?我从这个语法中知道 (type_cast *) 所以它与类型转换有关?

最佳答案

__cdecl 是一个 C language extension微软的编译器支持。它明确指定应使用“cdecl”调用约定调用函数,这与调用函数前后寄存器状态和堆栈的确切内部结构有关,以便传递参数和返回值.

在您的代码片段中,PullDown 被定义为具有三个参数的函数,前两个参数是 char **int.

该函数的最后一个参数 void (__cdecl **)(void) 是一个指针,该指针指向具有 cdecl 调用约定的函数的指针,该函数没有返回值且不接受任何参数。

为了打破这个声明,我们现在可以完全删除 __cdecl 并为这个参数添加一个变量名:

void (**param)(void)

声明中的*运算符指定它右边的表达式是一个指针,所以这意味着param是一个指针,同时*param 是一个指针(因此 param 是一个指向指针的指针)。为了理解这个指针指向什么,**param 现在可以用占位符 foobar 代替,给出以下内容:

void (foobar)(void)

这现在有一对多余的括号,等同于以下内容:

void foobar(void)

这现在看起来像一个返回 void 的常规函数​​声明,带有一个 void 参数(没有参数也没有返回值)。因此,param 是指向具有此签名的函数的指针。

最后,__cdecl应用于它右边的表达式,因为**param代表函数,所以可以添加__cdecl**param 的左边表示这个函数有 cdecl 调用约定:

void (__cdecl **param)(void)

您的代码片段中的参数仅删除了参数名称 param,与从 char **paramint param< 中删除的方式相同.

一般来说,在使用 Visual Studio 编译 C 和 C++ 代码时,cdecl 调用约定应该是默认的,因此显式指定 __cdecl 应该是多余的。但是,有时需要指定函数具有 __stdcall 调用约定,并且在处理函数指针时确保 stdcall 函数仅通过 __stdcall< 调用非常重要 函数指针和 cdecl 函数只能通过 __cdecl 函数指针调用(这应该是默认的)。尝试使用错误的调用约定调用函数很可能会使您的程序崩溃或使其处于不确定状态。

关于c - __cdecl 在 C 函数参数中的用途是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50911597/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com