gpt4 book ai didi

c++ - C++ 中有什么方法可以转发声明函数原型(prototype)?

转载 作者:可可西里 更新时间:2023-11-01 17:56:27 24 4
gpt4 key购买 nike

我经常使用前向类声明和指向此类类的指针。

我现在需要通过多个层传递一个函数指针。我宁愿将声明我的函数指针原型(prototype)的 header 仅包含到取消引用函数指针的模块中,而不是包含到仅传递该指针值的每个层中。

这可能吗?

=====

从回复我怀疑我没有表达清楚问题。我寻求类似于前向类声明的类比。我们都同意我可以写:

类 foo;

无效栏(foo*);

void waz(foo* p) { bar(p);

请注意,waz 除了名称之外,对 foo 类一无所知。也许 bar 可以访问 foo 的完整描述。也许 bar 只会将 p 传递得更远。谁在乎?只有那些取消引用 foo* 的站点。所有其他站点只需要“class foo;”。

同样我知道我可以写:

typedef void foo(int, double);

无效栏(foo*);

void waz(foo* p) { bar(p);

不同之处在于,现在标识符 foo 不仅表示函数类型,而且还带有完整的签名/原型(prototype)。这迫使我陷入两种不愉快的场景之一:

1) 在多个站点克隆 typedef(糟糕!易碎!)2) 将 typedef 粘贴在 header 中,并将其包含在提到 foo* 的任何地方。

注意不对称性:在数据对象的情况下,我只需要在我想取消引用 foo* 的那些点提供类 foo 的完整描述;在函数的情况下,我需要在任何地方提供完整的签名/原型(prototype),我想提到一个 foo*。

那么有什么方法可以弥补这种不对称性吗?

最佳答案

您可以使用未定义的结构类型来执行此操作,但需要额外取消引用。

将其放入主头文件中:

typedef struct FuncStruct *FuncPtr;

这声明了 struct FuncStruct 但没有声明任何字段,然后它声明了一个指向此结构的指针,称为 FuncPtr。您可以传递 FuncPtr,但不能取消引用它们。

然后在特定文件(或更具体的 .h 文件)中,您实际上可以像这样定义 struct FuncStruct:

struct FuncStruct {
int (*f)(int, char, double);
};

然后通过此定义的代码可以取消引用 FuncPtr 以获取实际的函数指针。

请注意,这是对强制转换的额外取消引用,这意味着您需要对 FuncStruct 进行一些内存管理。

关于c++ - C++ 中有什么方法可以转发声明函数原型(prototype)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2573432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com