C错误:参数类型不完整

时间:2015-03-21 16:38:11

标签: c

我是一个相对较新的C程序员,所以请忍受我的无知:-) 我正在尝试为valgrind编译一个自定义工具。该工具最初是在大约8年前编写的,它基于更古老的valgrind版本。 valgrind的原始版本不再编译当前内核,因此我尝试将自定义工具与svn存储库中的最新版本的valgrind集成。

我有一个非常持久的问题,我不断收到一条消息说: error: parameter xxxx has an incomplete type

我在以下网址阅读帖子:[make - C:field的类型不完整 - Stack Overflow] [C: field has incomplete type 并且已经验证包含文件确实包含在c程序中。

我怀疑它更多地与结构的定义随时间发生变化这一事实有关:

旧代码

typedef struct _VgHashTable * VgHashTable;

/* Make a new table.  Allocates the memory with VG_(calloc)(), so can
   be freed with VG_(free)().  The table starts small but will
   periodically be expanded.  This is transparent to the users of this
   module. */
extern VgHashTable VG_(HT_construct) ( HChar* name );

*新代码*

typedef struct _VgHashTable VgHashTable;

/* Make a new table.  Allocates the memory with VG_(calloc)(), so can
   be freed with VG_(free)().  The table starts small but will
   periodically be expanded.  This is transparent to the users of this
   module. The function never returns NULL. */
extern VgHashTable *VG_(HT_construct) ( const HChar* name );

访问VgHashTable的代码是:

static Int ca_count_hashtable( VgHashTable table )

如何更改代码才能正确使用VgHashTable的新定义?

1 个答案:

答案 0 :(得分:0)

如果您希望ca_count_hashtableVgHashTable而不是VgHashTable *一起使用,则需要在声明struct _VgHashTable {...};之前使用实际的ca_count_hashtable行,因为编译器没有知道struct _VgHashTable在那一点包含的内容(它的大小,成员是什么等)

我的意思的一个例子:

struct Foo;

int Foo_n(struct Foo f) { return f.n; }

// Needs to be moved before "Foo_n" for "Foo_n" to work!
struct Foo { int n; };

因为Foo_n不知道成员struct Foo有什么,所以它无法确定结构的大小(包括结构填充),在内存中访问它们的成员的偏移量等。除非在声明函数之前完全定义类型,否则不能对该类型的对象执行任何操作。当然,您可以声明函数需要指向该类型对象的指针,但在完全定义类型之前,函数无法访问结构对象的任何成员。换句话说,这是无效的:

/*
 * Foo.h
 */
struct Foo;
int Foo_n(struct Foo *); //Pointers to incomplete types are OK in declarations.

/*
 * Foo.c
 */
#include "Foo.h"

int Foo_n(struct Foo *f)
{
    /*
     * Invalid: does "struct Foo" contain a member named "n"?  Where is it located
     * (relative to the beginning of the structure)?
     */
    return f->n;
}

struct Foo { int n; }; //"Foo_n" needs me, but I'm stuck down here.  Please move me?

但这是有效的:

/*
 * Foo.h
 */
struct Foo;
int Foo_n(struct Foo *); //Pointers to incomplete types are OK in declarations.

/*
 * Foo.c
 */
#include "Foo.h"

struct Foo { int n; }; //"Foo_n" can use me!  I'm so happy I moved!

int Foo_n(struct Foo *f)
{
    return f->n;
}