如何订购彼此使用的C结构/函数声明?

时间:2017-02-25 18:31:28

标签: c function pointers struct symbols

我正在尝试使用名称" IExampleVtbl" 创建一个结构,该结构将包含指向我的函数的指针(SetStringPtr,GetStringPtr)成为另一个结构" IExample" 的一部分。

但我想将其他结构" IExample" 作为参数传递给函数(SetStringPtr,GetStringPtr)

这是代码:

#include <windows.h>
#include <stdio.h>

typedef struct {
    SetStringPtr *SetString;
    GetStringPtr *GetString;
} IExampleVtbl;

typedef struct {
    IExampleVtbl *lpVtbl;
    DWORD   count;
    char    buffer[80];
} IExample;

typedef long SetStringPtr(IExample *, char *);
typedef long GetStringPtr(IExample *, char *, long);

long SetString(IExample *this, char * str)
{
    ...

    return(0);
}

long GetString(IExample *this, char *buffer, long length)
{
    ...

    return(0);
}

正如您所看到的,第一个结构需要了解功能, 这些函数需要知道需要了解第一个结构的第二个结构。

我怎么能解决这个问题?

3 个答案:

答案 0 :(得分:4)

您可以按照以下顺序解决问题

  • 结构的typedef
  • 函数指针的typedef
  • 结构定义
  • 功能定义

为了实现这一目标,您需要使用标签定义结构:

post '/posts/:id' do  # Change delete to post
...

答案 1 :(得分:1)

您将转发声明与type-alias定义结合使用:

// Forward declaration of the structure IExample
// And at the same time definition of the type-alias IExample
typedef struct IExample IExample;

typedef long SetStringPtr(IExample *, char *);
typedef long GetStringPtr(IExample *, char *, long);

// Now the definition of the structures
typedef struct { ... } IExampleVtbl;

// Because the previous type-alias definition, we need to specify a structure tag
struct IExample { ... };

答案 2 :(得分:0)

typedef的结构为typedef&#39; d可以在struct的定义之前,所以稍微重新安排应该让事情在这里工作

typedef struct IExample IExample;

typedef long SetStringPtr(IExample *, char *);
typedef long GetStringPtr(IExample *, char *, long);

typedef struct {
    SetStringPtr *SetString;
    GetStringPtr *GetString;
} IExampleVtbl;

struct IExample {
    IExampleVtbl *lpVtbl;
    long   count;
    char    buffer[80];
};