C 定义一个包含函数指针的结构,该函数指针指向将该结构作为参数的函数

C 定义一个包含函数指针的结构,该函数指针指向将该结构作为参数的函数,c,struct,function-pointers,C,Struct,Function Pointers,以下结构定义是否安全 typedef struct s_foo { void (*func)(s_foo); /* A few other fields */ } foo; 我需要能够在其中存储指向表单函数的指针 void function_name(foo f){ /* Use f.func and other fields. */ } 所以有两件事:使用s_foo而不是foo可以吗,以及只要结构本身在函数指针中就可以吗?我知道可以使用指向结构的指针,但我从未见过这样的情况

以下结构定义是否安全

typedef struct s_foo {
  void (*func)(s_foo);
  /* A few other fields */
} foo;
我需要能够在其中存储指向表单函数的指针

void function_name(foo f){
    /* Use f.func and other fields. */
}
所以有两件事:使用
s_foo
而不是
foo
可以吗,以及只要结构本身在函数指针中就可以吗?我知道可以使用指向结构的指针,但我从未见过这样的情况。(我简化了发布代码;我保证在我的申请中这是必要的!)


注意:因为
foo
太小了,我真的想通过值将它传递到
函数\u name
。我的
函数\u name
函数对性能至关重要,不必要的指针解引用将是一件大事。我只是想把三个参数打包成一个参数。

我相信这段代码在原则上是很好的。只是您误用了C名称空间。这就是为什么
typedef
有点误导性,应该非常谨慎地使用IMO。它极大地混淆了名称空间的理解

在您的示例中,您声明了一个函数指针,例如
void(*func)(s_foo)。在你的程序中没有一个
s\u foo
这样的函数作为参数,只有一个
struct s\u foo
在不同的名称空间中是不同的东西

试试这个,不要让typedefs混淆东西,它应该可以正常工作

struct foo {
  void (*func)(struct foo);
  /* A few other fields */
};

void function_name(struct foo f){
    /* Use f.func and other fields. */
}

你为什么要这样做?@Someprogrammerdude问题是我需要在性能极其关键的应用程序中使用它,在这些应用程序中,取消引用额外的指针将非常浪费。既然它是一个如此微小的结构,我希望能够通过值传递它。@MichaelWalz我有一个很好的理由。。。如果你必须:)@Someprogrammerdude你不必完全定义一个结构来声明一个作为参数的函数,那就把它当作一个理论问题来考虑。然后首先测量它。即使它的性能至关重要,使用指针在现代编译器和平台上也可以忽略不计。请记住,如果您通过“按值”传递,那么整个结构都会被复制,这当然会对性能造成影响。您能解释一下我是如何滥用名称空间的吗?抱歉,am n00b。没有必要预先声明
struct foo分别显示。一旦你进入了实际的
struct foo
声明,
struct foo
已经被认为是一种类型(虽然还没有完成)。@AnT谢谢,我没有100%的把握,也没有时间检查我的C99规范,所以选择了安全的路线。删除它。@RenéG你到底是什么意思?我想你可以这样做:
structfoo;typedef结构foo-bar;结构foo{void(*func)(bar);}但它开始变得非常丑陋。。。老实说,我觉得这更像是在一个新问题的范围内。@RenéG:是的。在
typedef
中提到它会预先将其删除。不需要单独声明<代码>类型定义结构foo foo;结构foo{void(*func)(foo);}