gpt4 book ai didi

C错误: parameter has incomplete type

转载 作者:行者123 更新时间:2023-11-30 19:43:47 32 4
gpt4 key购买 nike

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

我有一个非常持久的问题,因为我不断收到一条消息说:错误:参数 xxxx 的类型不完整

我读了这篇文章:[make - C: field has incomplete type - 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 的新定义?

最佳答案

如果您希望 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;
}

关于C错误: parameter has incomplete type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29185240/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com