以下结构定义是否安全?
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
非常小,我真的希望将其按值传递到function_name
。我的function_name
函数对性能至关重要,而不必要的指针取消引用将是一件大事。我真的只想把三个论点整合在一起。
答案 0 :(得分:3)
我相信这段代码原则上很好。只是你在滥用C名称空间。这就是typedefs
具有误导性的原因,IMO应该非常谨慎地使用。它极大地混淆了名称空间的理解。
在您的示例中,您已声明了一个函数指针,例如void (*func)(s_foo);
。在你的程序中没有s_foo
这个函数作为参数,只有struct s_foo
这些在不同的命名空间中是不同的东西。
试试这个,没有typedef来混淆应该正常工作的东西。:
struct foo {
void (*func)(struct foo);
/* A few other fields */
};
void function_name(struct foo f){
/* Use f.func and other fields. */
}