在C语言中初始化一个函数指针

6
我有这个函数。
uint8_t Authorization_getRole (char const* userId, UsertoRole_T const *roleTable)

主程序中我有以下代码:

given_Role = Authorization_getRole (userId, roleTable)

我想将函数调用替换为函数指针:
uint8_t (*getRole_ptr)()

given_Role = &getRole_ptr;

我的问题是:

在哪里初始化函数指针getRole_ptr?

如何初始化函数指针?

下面的语法是否正确?

getRole_ptr = Authorization_getRole (userId, roleTable)
5个回答

5
我建议使用带有函数指针的typedef。这样,您可以编写以下内容:
// Make sure to get the function's signature right here
typedef uint8_t (*GetRole_Ptr_T)(char const*, UsertoRole_T const*);

// Now initialize your pointer:
GetRole_Ptr_T getRole_ptr = Authorization_getRole;

// To invoke the function pointed to:
given_Role = getRole_ptr(userId, roleTable);

有关“在哪里初始化函数指针getRole_ptr?”:这取决于您的需求。您可以在声明指针时进行初始化,就像我在示例中所做的那样,或者您可以稍后通过赋值来更改指针:

getRole_ptr = Some_function_with_correct_signature;

4

uint8_t (*getRole_ptr)()

这个函数指针需要与所指向的函数完全相同的格式。因此,您需要指定这两个参数的类型:

uint8_t (*getRole_ptr)(const char*, const UsertoRole_T*);

否则,C语言会将您的代码带到一个可怕的地方,叫做隐式领域,那里存在着奇怪的生物,比如“默认参数提升”,您甚至不想知道那是什么,只需使用正确的参数编写完整函数即可。
希望您能看出刚刚写的函数指针声明看起来像一堆难以理解的废话。因此,您应该使用typedef代替:
typedef uint8_t (*role_ptr_t)(const char*, const UsertoRole_T*);
...
role_ptr_t getRole_ptr;

我应该在哪里初始化getRole_ptr函数指针?如何初始化函数指针?

正式的初始化只能在变量声明的同一行进行。因此,如果您一定要使用初始化而不是赋值,则必须在声明的同一行执行:

 role_ptr_t getRole_ptr = Authorization_getRole;

以下语法正确吗? 不正确。请参见上面的正确语法。

2

你不能用一个函数指针来替代函数调用。不过,你可以使用该指针来进行函数调用:

uint8_t (*getRole_ptr)(char const*, UsertoRole_T const *)

given_Role = getRole_ptr( /* some args maybe */);

初始化函数指针:

uint8_t (*getRole_ptr)(char const*, UsertoRole_T const *) = Authorization_getRole;

一则小提示:在定义函数指针时,需要指定其参数。

2

通常情况下,您需要定义

uint8_t Authorization_getRole (char const* userId, UsertoRole_T const *roleTable);

在你的页眉中。 在代码块中,然后...(请参见注释)
int main(int argc, const char * argv[])
{
    uint8_t x;

    // define "func" as a pointer to a function with specific arguments & return value

    uint8_t (*func)(char const* userId, UsertoRole_T const *roleTable);

    // point "func" to the function

    func = &Authorization_getRole;

    // you can use "func" as a variable or invoke it

    x = func( "FOO", NULL);

}

0
变量声明应该是:
uint8_t(*getRole_ptr)(char const*, UsertoRole_T const *);

你可以这样赋值:

getRole_ptr = Authorization_getRole;

然后你可以这样调用它:

given_Role = getRole_ptr(userId, roleTable);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接