我现在需要通过多个层传递函数指针.我更愿意将声明我的函数指针原型的头部包含在取消引用函数指针的模块中,而不是包含在简单地传递该指针值的每个层中.
这可能吗?
=====
从回复中我怀疑我没有明确地表达问题.我寻求类似于前瞻性声明.我们都同意我可以写:
foo;
void bar(foo *);
void waz(foo * p){bar(p); }
请注意,除了名称之外,waz对类foo一无所知.也许酒吧可以访问foo的完整描述.也许酒吧只会进一步传递.谁在乎?只有那些取消引用foo *的网站.所有其他网站只需要“class foo;”.
同样地,我知道我可以写:
typedef void foo(int,double);
void bar(foo *);
void waz(foo * p){bar(p); }
不同之处在于,现在标识符foo不仅已知表示函数类型,而且还已经携带完整的签名/原型.这迫使我陷入两种不愉快的情景之一:
1)在多个站点克隆typedef(哎呀!脆弱!)
2)将typedef粘贴在标题中,并将其包含在提到foo *的任何地方.
注意不对称性:在数据对象的情况下,我只需要在我要取消引用foo *的那些点上提供类foo的完整描述;在函数的情况下,我需要提供完整的签名/原型,我想提到一个foo *.
那么无论如何要弥补这种不对称性?
解决方法
把它放在主头文件中:
typedef struct FuncStruct *FuncPtr;
这声明了struct FuncStruct但是没有声明任何字段,然后它声明了一个指向这个结构的指针FuncPtr.您可以传递FuncPtrs,但不能取消引用它们.
然后在一个特定的文件(或更具体的.h文件)中,你可以实际定义一个结构FuncStruct,如下所示:
struct FuncStruct { int (*f)(int,char,double); };
然后,通过此定义的代码可以取消引用FuncPtr以获取实际的函数指针.
请注意,这只是一个强制转换的额外解引用,这意味着您需要对FuncStructs进行一些内存管理.