【问题标题】:how to call function pointer in a struct?如何在结构中调用函数指针?
【发布时间】:2018-03-16 03:55:02
【问题描述】:

我正在使用 c 语言中的 xinu 嵌入式操作系统。我创建了一个新的头文件并声明了一个结构:

struct callout {
   uint32 time;      /* Time of delay in ms */
   void *funcaddr;   /* Function pointer */
   void *argp;       /* Function arguments */
   uint32 cid;       /* Callout id for the specific callout */
   char *sample;

};

在我的 main 中,我尝试声明一个 struct 对象并将 funcaddr 函数化为一个函数。

void test();

process main(void) {
   struct callout *coptr;

   coptr->sample ="hellowolrd";
   coptr->funcaddr = &test;

   (coptr->funcaddr)(coptr->argp);    //error here
   kprintf("coptr %s \n", coptr->sample);

   return OK;

 }

 void test() {
    kprintf("this is the test function \n");
 }

我尝试通过结构调用函数指针,但出现错误: main.c:30:19:错误:被调用的对象不是函数或函数指针 (coptr->funcaddr)();

请说明调用函数指针的正确语法是什么。

【问题讨论】:

  • 这里的问题是void*只是一个通用的对象指针。您不能将其用于函数指针。但是,这是某些编译器上可用的常见非标准扩展。如果您需要在标准 C 中可移植的通用函数指针,最好在整数类型之间进行转换:uintptr_t
  • 如果函数指针是一个不同的变量或在struct 中,它没有任何区别。只需查阅您的 C 书籍,了解如何使用函数指针和声明类型。

标签: c


【解决方案1】:

您已将funcaddr 声明为对象指针。要声明一个函数指针,它看起来像这样:

struct callout {
   uint32 time;
   void (*funcaddr)();  // <-------- function pointer

那么你的其余代码应该可以工作了。


如果您没有看到coptr-&gt;funcaddr = &amp;test; 行的错误消息,那么我建议您调整您的编译器设置,重要的是让编译器可以告诉您可用的信息。

【讨论】:

  • 您的回答很完美,感谢您的建议。我还有几个问题:1)你能告诉我将对象指针转换为函数的语法吗? 2)如何将我的结构变量 argp 作为参数传递给函数?是的,编译器没有给我一个错误。我会仔细看看的。感谢您的建议。
  • @simhuang 您传递argp 的代码已经正确。你不需要使用任何演员表。 (如果您出于某种原因确实想要转换,那么它与任何其他转换相同,您将类型名称放在括号中。例如 (void(*)())objp
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
  • 2015-12-23
  • 2021-05-10
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
相关资源
最近更新 更多