我有功能
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)
答案 0 :(得分: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;
答案 1 :(得分: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 :(得分: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;
附注:在定义函数指针时,需要指定它的参数。
答案 3 :(得分:1)
通常你会定义
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);
}
答案 4 :(得分:0)
变量声明应为:
uint8_t(*getRole_ptr)(char const*, UsertoRole_T const *);
您可以使用以下内容进行分配:
getRole_ptr = Authorization_getRole;
你用它来称呼它:
given_Role = getRole_ptr(userId, roleTable);