在我开始之前:
请注意,我不想
为了改变我在这里向你们展示的主要设计。
如果你觉得这个不合适,可以随意更改标题
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()所需的信息。

10-01 09:22