我是一个相对较新的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的新定义?
答案 0 :(得分:0)
如果您希望ca_count_hashtable
与VgHashTable
而不是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;
}