c语言中的函数描述符

c语言中的函数描述符,c,C,我试图实现一个简单的fun_desc类型函数描述符数组 struct fun_desc { char *name; void (*fun)(); }; 我有两个函数f1和f2都是coolFunct类型 typedef int (*coolFunct) (unsigned int); 我的数组定义如下 struct fun_desc funArr[]={{"f1", &f1}, {"f2",&f2}}; 现在我试图调用数组中的函数,我想我需要将它转换为coolFunc

我试图实现一个简单的fun_desc类型函数描述符数组

struct fun_desc {
  char *name;
  void (*fun)();
};
我有两个函数f1和f2都是coolFunct类型

typedef int (*coolFunct) (unsigned int);
我的数组定义如下

struct fun_desc funArr[]={{"f1", &f1}, {"f2",&f2}};
现在我试图调用数组中的函数,我想我需要将它转换为coolFunct,因为它是未指定的类型(或者我错了) 但是下一个调用不起作用(没有编译或运行时错误,只是什么都没有发生):

一如既往,非常感谢您的帮助…

请使用以下语法:

(*funArr[0].fun)();
另外,不要强制转换,因为您的函数类型不同,事情会崩溃,请尝试以下方法:

typedef int (*coolFunct) (unsigned int);

struct fun_desc {
  char *name;
  coolFunct fun;
};

(*funArr[0].fun)(1);
编辑:如果确实要强制转换,则调用的语法为:

((coolFunct)funArr[0].fun)(1);
使用以下语法:

(*funArr[0].fun)();
另外,不要强制转换,因为您的函数类型不同,事情会崩溃,请尝试以下方法:

typedef int (*coolFunct) (unsigned int);

struct fun_desc {
  char *name;
  coolFunct fun;
};

(*funArr[0].fun)(1);
编辑:如果确实要强制转换,则调用的语法为:

((coolFunct)funArr[0].fun)(1);

在结构中存储函数指针时,需要强制转换它们。你的编译器应该给你一个诊断。但很难看出它是你问题的根源

#include <stdio.h>
typedef int (*coolFunct) (unsigned int);
typedef void (*whackFunct)();

int f1(unsigned i) { puts("f1"); return 1; }
int f2(unsigned i) { puts("f2"); return 2; }

struct fun_desc {
  char *name;
  void (*fun)();
};

struct fun_desc funArr[]={{"f1", (whackFunct)&f1}, {"f2", (whackFunct)&f2}};

int main()
{
    printf("function returned %d\n", ((coolFunct)funArr[0].fun)(1));
    return 0;
}
#包括
typedef int(*coolFunct)(无符号int);
typedef void(*whackFunct)();
int f1(无符号i){put(“f1”);返回1;}
int f2(无符号i){put(“f2”);返回2;}
结构乐趣描述{
字符*名称;
空虚(*乐趣)();
};
struct fun_desc funArr[]={{“f1”,(whackFunct)&f1},{“f2”,(whackFunct)&f2};
int main()
{
printf(“函数返回%d\n”,((coolFunct)funArr[0].fun)(1));
返回0;
}

将函数指针存储在结构中时,需要强制转换它们。你的编译器应该给你一个诊断。但很难看出它是你问题的根源

#include <stdio.h>
typedef int (*coolFunct) (unsigned int);
typedef void (*whackFunct)();

int f1(unsigned i) { puts("f1"); return 1; }
int f2(unsigned i) { puts("f2"); return 2; }

struct fun_desc {
  char *name;
  void (*fun)();
};

struct fun_desc funArr[]={{"f1", (whackFunct)&f1}, {"f2", (whackFunct)&f2}};

int main()
{
    printf("function returned %d\n", ((coolFunct)funArr[0].fun)(1));
    return 0;
}
#包括
typedef int(*coolFunct)(无符号int);
typedef void(*whackFunct)();
int f1(无符号i){put(“f1”);返回1;}
int f2(无符号i){put(“f2”);返回2;}
结构乐趣描述{
字符*名称;
空虚(*乐趣)();
};
struct fun_desc funArr[]={{“f1”,(whackFunct)&f1},{“f2”,(whackFunct)&f2};
int main()
{
printf(“函数返回%d\n”,((coolFunct)funArr[0].fun)(1));
返回0;
}


是否有令人信服的理由不执行
struct fun_desc{char*name;int(*fun)(unsigned int);}?甚至在结构中使用typedef。此外,这些函数是否有明显的副作用?或者您是否/是否应该收集/显示返回值?即使没有强制转换,GCC4.4也适用于我。你用的是什么C编译器?你试过使用调试器吗?@Emil-演员阵容是必要的。这是没有的。另外,如果没有强制转换,
int
返回值是不可能收集的?甚至在结构中使用typedef。此外,这些函数是否有明显的副作用?或者您是否/是否应该收集/显示返回值?即使没有强制转换,GCC4.4也适用于我。你用的是什么C编译器?你试过使用调试器吗?@Emil-演员阵容是必要的。这是没有的。此外,如果没有强制转换,
int
返回值不可能收集。错误。a) 在调用之前不需要取消引用,b)需要回溯到适当的签名(函数是
int(*)(unsigned)
,但是您使用
void(*)(
)调用它,这是UB)有没有办法用void*指针实现这一点?尝试获取函数i get的返回int值:error:void值不被忽略,因为它应该是合法的。该标准要求将一个函数指针类型转换为另一个函数指针类型,然后再转换回原来的函数。创建“泛型”函数指针类型,将所有函数强制转换为该类型以供存储,然后将它们强制转换回相应的类型以调用它们是一种常见的技术。@james t-根据C标准,将函数指针存储在
void*
指针(或任何其他对象指针)类型中是不安全的。它是POSIX标准的一部分,如果对您来说“足够好”的话,它可能在Windows上工作。但是你的方法应该是有效的。如果不是,则程序中的代码必须与您发布的示例代码不同。a)由于成员fp的原因,习惯是有效的。但是,是的,不戴眼镜更干净。b) 结构变量签名是
void(*)(
)-他的函数实际使用的是typedef还是结构中的类型还有待观察。错误。a) 在调用之前不需要取消引用,b)需要回溯到适当的签名(函数是
int(*)(unsigned)
,但是您使用
void(*)(
)调用它,这是UB)有没有办法用void*指针实现这一点?尝试获取函数i get的返回int值:error:void值不被忽略,因为它应该是合法的。该标准要求将一个函数指针类型转换为另一个函数指针类型,然后再转换回原来的函数。创建“泛型”函数指针类型,将所有函数强制转换为该类型以供存储,然后将它们强制转换回相应的类型以调用它们是一种常见的技术。@james t-根据C标准,将函数指针存储在
void*
指针(或任何其他对象指针)类型中是不安全的。它是POSIX标准的一部分,如果对您来说“足够好”的话,它可能在Windows上工作。但是你的方法应该是有效的。如果不是,则程序中的代码必须与您发布的示例代码不同。a)由于成员fp的原因,习惯是有效的。但是,是的,不戴眼镜更干净。b) 结构变量签名是
void(*)(
)-他的函数实际上是使用typedef还是结构中的类型仍有待观察。处理警告的:-)处理警告的:-)