获取C/C+中函数内部的函数地址+;?
我试图返回我调用的函数的地址,类似于:获取C/C+中函数内部的函数地址+;?,c,pointers,C,Pointers,我试图返回我调用的函数的地址,类似于: void * myfunctionname(some parameters) { //some codes //more codes. return &myfunctionname; } 如何用正确的类型替换void*,以获得正确的签名?问题是要有正确的返回类型,它是“递归的”,因为它包含自身 正如我所知,拥有“递归”类型的唯一方法是使用结构或联合,所以 或 汇编(两种方式相同): 问题是要有正确的返回类型,它是“递归的”,因为它包含
void * myfunctionname(some parameters) {
//some codes
//more codes.
return &myfunctionname;
}
如何用正确的类型替换
void*
,以获得正确的签名?问题是要有正确的返回类型,它是“递归的”,因为它包含自身
正如我所知,拥有“递归”类型的唯一方法是使用结构或联合,所以
或
汇编(两种方式相同):
问题是要有正确的返回类型,它是“递归的”,因为它包含自身 正如我所知,拥有“递归”类型的唯一方法是使用结构或联合,所以 或 汇编(两种方式相同):
如果用指向函数的指针将“某些参数”括在结构中,可能更容易阅读,如中所示
typedef struct some_parameters
{
int a;
int b;
struct some_parameters*
(*my_function_name)(struct some_parameters*);
} Some_parm;
通过这种方式,您可以将函数编写为
Some_parm* my_function_name(Some_parm* parm)
{
// some codes
// more codes
// yet more code
printf("F(): a = %d, b = %d\n", parm->a, parm->b);
parm->a += 1;
parm->b += 1;
parm->my_function_name = my_function_name;
return parm;
};
然后像这样编写代码
Some_parm sp;
sp.a = 10;
sp.b = 20;
sp.my_function_name = NULL;
my_function_name(&sp); // call function directly
printf("main(): a = %d, b = %d\n", sp.a, sp.b);
sp.my_function_name(&sp); // call function from inside sp
printf("main(): a = %d, b = %d\n", sp.a, sp.b);
sp.my_function_name(&sp);
printf("main(): a = %d, b = %d\n", sp.a, sp.b);
my_function_name(&sp);
printf("main(): a = %d, b = %d\n", sp.a, sp.b);
pF_fii my_other_function(pF_fii one, int a, int b)
{
// some codes
// more codes
// yet more code
printf("[function] a = %d, b = %d\n", a, b);
return (pF_fii)&my_other_function;
};
但是您可以编写typedef
:
typedef void* (*pF_fii)
( void* (*)(void*, int, int), int, int );
用参数替换2int
。然后像这样声明函数
Some_parm sp;
sp.a = 10;
sp.b = 20;
sp.my_function_name = NULL;
my_function_name(&sp); // call function directly
printf("main(): a = %d, b = %d\n", sp.a, sp.b);
sp.my_function_name(&sp); // call function from inside sp
printf("main(): a = %d, b = %d\n", sp.a, sp.b);
sp.my_function_name(&sp);
printf("main(): a = %d, b = %d\n", sp.a, sp.b);
my_function_name(&sp);
printf("main(): a = %d, b = %d\n", sp.a, sp.b);
pF_fii my_other_function(pF_fii one, int a, int b)
{
// some codes
// more codes
// yet more code
printf("[function] a = %d, b = %d\n", a, b);
return (pF_fii)&my_other_function;
};
这是输出
F():a=10,b=20
main():a=11,b=21
F():a=11,b=21
main():a=12,b=22
F():a=12,b=22
main():a=13,b=23
F():a=13,b=23
main():a=14,b=24
仅使用函数
[功能]a=2,b=3
[功能]a=4,b=5
这个节目的
#包括
类型定义无效*(*pF_fii)
(void*(*)(void*,int,int),int,int);
pF_fii my_other_函数(pF_fii one,int a,int b)
{
//一些代码
//更多代码
//还有更多代码
printf(“[函数]a=%d,b=%d\n”,a,b);
返回(pF_fii)&my_other_函数;
};
typedef结构的一些参数
{
INTA;
int b;
构造一些参数*
(*我的函数名)(构造一些参数*);
}一些人;
一些参数*我的函数名(一些参数*参数)
{
//一些代码
//更多代码
//还有更多代码
printf(“F():a=%d,b=%d\n”,参数->a,参数->b);
parm->a+=1;
parm->b+=1;
参数->我的函数名称=我的函数名称;
返回parm;
};
内部主(空)
{
一些帕尔姆sp;
sp.a=10;
sp.b=20;
sp.my_function_name=NULL;
my_function_name(&sp);//直接调用函数
printf(“main():a=%d,b=%d\n”,sp.a,sp.b);
sp.my_function_name(&sp);//从sp内部调用函数
printf(“main():a=%d,b=%d\n”,sp.a,sp.b);
sp.my\u函数名称(&sp);
printf(“main():a=%d,b=%d\n”,sp.a,sp.b);
我的职能部门名称(&sp);
printf(“main():a=%d,b=%d\n”,sp.a,sp.b);
//使用独立函数
printf(“\n仅使用函数\n\n”);
pF_fii另一个f=NULL;
另一个函数=我的另一个函数(另一个函数,2,3);
另一个函数=我的另一个函数(另一个函数,4,5);
返回0;
};```
如果用指向函数的指针将“某些参数”括在结构中,可能更容易阅读,如中所示
typedef struct some_parameters
{
int a;
int b;
struct some_parameters*
(*my_function_name)(struct some_parameters*);
} Some_parm;
通过这种方式,您可以将函数编写为
Some_parm* my_function_name(Some_parm* parm)
{
// some codes
// more codes
// yet more code
printf("F(): a = %d, b = %d\n", parm->a, parm->b);
parm->a += 1;
parm->b += 1;
parm->my_function_name = my_function_name;
return parm;
};
然后像这样编写代码
Some_parm sp;
sp.a = 10;
sp.b = 20;
sp.my_function_name = NULL;
my_function_name(&sp); // call function directly
printf("main(): a = %d, b = %d\n", sp.a, sp.b);
sp.my_function_name(&sp); // call function from inside sp
printf("main(): a = %d, b = %d\n", sp.a, sp.b);
sp.my_function_name(&sp);
printf("main(): a = %d, b = %d\n", sp.a, sp.b);
my_function_name(&sp);
printf("main(): a = %d, b = %d\n", sp.a, sp.b);
pF_fii my_other_function(pF_fii one, int a, int b)
{
// some codes
// more codes
// yet more code
printf("[function] a = %d, b = %d\n", a, b);
return (pF_fii)&my_other_function;
};
但是您可以编写typedef
:
typedef void* (*pF_fii)
( void* (*)(void*, int, int), int, int );
用参数替换2int
。然后像这样声明函数
Some_parm sp;
sp.a = 10;
sp.b = 20;
sp.my_function_name = NULL;
my_function_name(&sp); // call function directly
printf("main(): a = %d, b = %d\n", sp.a, sp.b);
sp.my_function_name(&sp); // call function from inside sp
printf("main(): a = %d, b = %d\n", sp.a, sp.b);
sp.my_function_name(&sp);
printf("main(): a = %d, b = %d\n", sp.a, sp.b);
my_function_name(&sp);
printf("main(): a = %d, b = %d\n", sp.a, sp.b);
pF_fii my_other_function(pF_fii one, int a, int b)
{
// some codes
// more codes
// yet more code
printf("[function] a = %d, b = %d\n", a, b);
return (pF_fii)&my_other_function;
};
这是输出
F():a=10,b=20
main():a=11,b=21
F():a=11,b=21
main():a=12,b=22
F():a=12,b=22
main():a=13,b=23
F():a=13,b=23
main():a=14,b=24
仅使用函数
[功能]a=2,b=3
[功能]a=4,b=5
这个节目的
#包括
类型定义无效*(*pF_fii)
(void*(*)(void*,int,int),int,int);
pF_fii my_other_函数(pF_fii one,int a,int b)
{
//一些代码
//更多代码
//还有更多代码
printf(“[函数]a=%d,b=%d\n”,a,b);
返回(pF_fii)&my_other_函数;
};
typedef结构的一些参数
{
INTA;
int b;
构造一些参数*
(*我的函数名)(构造一些参数*);
}一些人;
一些参数*我的函数名(一些参数*参数)
{
//一些代码
//更多代码
//还有更多代码
printf(“F():a=%d,b=%d\n”,参数->a,参数->b);
parm->a+=1;
parm->b+=1;
参数->我的函数名称=我的函数名称;
返回parm;
};
内部主(空)
{
一些帕尔姆sp;
sp.a=10;
sp.b=20;
sp.my_function_name=NULL;
my_function_name(&sp);//直接调用函数
printf(“main():a=%d,b=%d\n”,sp.a,sp.b);
sp.my_function_name(&sp);//从sp内部调用函数
printf(“main():a=%d,b=%d\n”,sp.a,sp.b);
sp.my\u函数名称(&sp);
printf(“main():a=%d,b=%d\n”,sp.a,sp.b);
我的职能部门名称(&sp);
printf(“main():a=%d,b=%d\n”,sp.a,sp.b);
//使用独立函数
printf(“\n仅使用函数\n\n”);
pF_fii另一个f=NULL;
另一个函数=我的另一个函数(另一个函数,2,3);
另一个函数=我的另一个函数(另一个函数,4,5);
返回0;
};```
但是,您会如何处理函数的地址?在C语言中,您可以在函数内部使用函数的地址,甚至可以返回它。您的示例“just”具有错误的返回类型。您计划如何处理函数的地址?有这个地址能解决什么问题?有什么目的?要找出谁创建了一个线程,或者找出你在哪个线程回调中,或者…?@TürkerBerkeYıldırım,你应该返回一个函数指针,而不是一个void*
。但是,你会如何处理函数的地址呢?在C语言中,你可以使用函数内部的函数地址,甚至可以返回它。您的示例“just”具有错误的返回类型。您计划如何处理函数的地址?有这个地址能解决什么问题?有什么目的?要找出谁创建了一个线程,或者找出你在哪个线程回调中,或者…?@TürkerBerkeYıldırım你应该返回一个函数指针,而不是void*
@Türkerkeyıldırım你的问题很有趣,我从来没有遇到过这种情况。我想你必须做出决定