【发布时间】:2021-11-02 08:37:21
【问题描述】:
我有以下代码:
typedef void (*func_type)(int a, int b);
func_type func;
int main()
{
func = (func_type)GetProcAddress(NULL, "func");
}
此代码运行良好,但我想将func_type func; 更改为void func(int a, int b);(因为在键入参数时代码完成显示“func_type”而不是“func”)。
但是当我试图改变它时,编译器告诉我在主函数中“表达式必须是一个可修改的左值”。我试图在网上查找,但没有找到我的问题的答案。
代码变成这样:
typedef void (*func_type)(int a, int b);
void func(int a, int b);
int main()
{
func = (func_type)GetProcAddress(NULL, "func");
}
【问题讨论】:
-
这里没有定义任何函数。您正在定义函数 pointer,它指向其他已定义的函数。
-
请同时发布“您尝试更改它”的代码。
-
除了理智之外,没有什么能阻止你使用
void (*func)(int,int);和main,做func = (void (*)(int,int))GetProcAddress(NULL, "func");。您会很快意识到,使用原始代码显示的在类型别名中隐藏指针类型的两个真正有效原因之一是多么方便(另一个是黑盒“句柄”API)。 -
如果使用
typedef void func_type(int,int);,可能会更容易掌握。然后您可以将func定义为func_type *func。因为func是一个指向函数的指针。演员表将是 ` ... = (func*)GetProcAddress(...)`。 -
您的请求是不可能的 -
GetProcAddress返回一个指针,这是存储函数地址的唯一方法。如果您希望函数名称在编译时绑定到某个称为早期绑定且不是通过运行时调用完成的库函数GetProcAddress
标签: c function-pointers