在我开始之前:
请注意,我不想
为了改变我在这里向你们展示的主要设计。
如果你觉得这个不合适,可以随意更改标题
C++标签在这里,因为解决方案也应该是等价的。
我有一个头breakpoints.h
声明:
typedef struct BreakpointInfo BreakpointInfo;
/*
* Iterate all breakpoints known to the Breakpoints service,
* including breakpoints that are created by other (remote) clients.
*/
typedef void IterateBreakpointsCallBack(BreakpointInfo *, void *);
extern void iterate_breakpoints(IterateBreakpointsCallBack * callback, void * args);
相应的
breakpoints.c
定义了:struct BreakpointInfo {
Context * ctx;
LINK link_all;
/*
* A lot of members ..
*/
LINK link_hit_count;
};
现在我想在另一个文件中使用这个功能:
#include <tcf/services/breakpoints.h> // The header file
extern BreakpointInfo;
//extern struct BreakpointInfo; // Also did not work
void MyIterateBreakpointsCallBack(/* struct */ BreakpointInfo *bpInfo, void *args)
{
bpInfo->file;
}
void thread_function()
{
// ..
iterate_breakpoints(&MyIterateBreakpointsCallBack, 0);
// ..
}
但智能感知告诉我:
BreakpointInfo *bpInfo, Error: pointer to incomplete class type is not allowed.
所以问题是:
如果不将
context.c
的定义移到头文件中,这是否可能?我不想改变它,因为它是一个相当复杂的程序,我不想做这样的事情来破坏它的设计。
可能是我用错了,但如果我不能访问,为什么会有一个
BreakpointInfo
函数供我访问?我希望我的要求很清楚。如果你需要帮助,请告诉我。
谨致问候。
最佳答案
我不认为这是可能的,因为在MyIterateBreakpointsCallBack
中,您试图访问该类型的成员,而此时这需要一个完整的类型。
我不熟悉你正在尝试的项目,但一个快速的谷歌搜索提示我它的tcf.agent项目。如果这是真的,在快速查看breakpoints.h文件后,我注意到有一个get_breakpoint_attribute()
为您提供了一个名称/值对列表。也许这会给你实现MyIterateBreakpointsCallBack()
所需的信息。