Error: Conflcting types for xxx pointing to same declaration
Error: Conflcting types for xxx pointing to same declaration
我最近一直在写一点 C。我没有太多经验将所有内容都投入 headers,编写它们的实现等等 - 但我认为我知道的已经足够了。至少,直到今天 :P
长话短说 - 我收到 'conflicting types for ValueArray' 错误 - 但它指向我之前声明的同一行。
它在同一个文件中重复了一些声明,然后在另一个文件中也重复了声明。
P.S。该错误在 CLion 中也未加下划线。
In file included from chunk.h:2,
from vm.h:1,
from compiler.h:1,
from vm.c:5:
value.h:7:3: error: conflicting types for ‘ValueArray’
7 | } ValueArray;
| ^~~~~~~~~~
In file included from chunk.h:2,
from vm.h:1,
from vm.c:4:
value.h:7:3: note: previous declaration of ‘ValueArray’ was here
7 | } ValueArray;
| ^~~~~~~~~~
这里是value.h:
typedef double Value;
typedef struct {
int capacity;
int count;
Value* values;
} ValueArray;
void initValueArray(ValueArray* array);
void writeValueArray(ValueArray* array, Value value);
void freeValueArray(ValueArray* array);
我查看了我的代码,没有发现 ValueArray 的任何重新声明。我做了一些研究——它似乎取决于 ValueArray 的声明时间。不过对我来说,这似乎完全没问题。
作为参考,我正在关注 Bob Nystrom's guide Crafting Interpreters,但有一些我自己的曲折。
提前致谢!
错误是
In file included from chunk.h:2,
from vm.h:1,
from compiler.h:1,
from vm.c:5:
value.h:7:3: error: conflicting types for ‘ValueArray’
7 | } ValueArray;
但接下来我们会看到这个:
In file included from chunk.h:2,
from vm.h:1,
from vm.c:4:
注意包含路径不同。
您似乎正在编译 vm.c
。 vm.c
包含 compiler.h
,最终导致 value.h
被包含。
然后您包含 vm.h
,这 也 导致 value.h
被包含。
您需要使用include guards来防止文件被多次包含:
value.h
:
#ifndef MY_VALUE_H_INCLUDED
#define MY_VALUE_H_INCLUDED
(include file contents here)
#endif
您需要选择一个唯一的标识符(在此示例中为 MY_VALUE_H_INCLUDED
)。请注意,以两个下划线 (__
) 或一个下划线和一个大写字母 (_V
) 开头的标识符将使用为实现保留的值。
你可能有循环引用,在这种情况下你需要使用forward declarations。
我最近一直在写一点 C。我没有太多经验将所有内容都投入 headers,编写它们的实现等等 - 但我认为我知道的已经足够了。至少,直到今天 :P
长话短说 - 我收到 'conflicting types for ValueArray' 错误 - 但它指向我之前声明的同一行。
它在同一个文件中重复了一些声明,然后在另一个文件中也重复了声明。
P.S。该错误在 CLion 中也未加下划线。
In file included from chunk.h:2,
from vm.h:1,
from compiler.h:1,
from vm.c:5:
value.h:7:3: error: conflicting types for ‘ValueArray’
7 | } ValueArray;
| ^~~~~~~~~~
In file included from chunk.h:2,
from vm.h:1,
from vm.c:4:
value.h:7:3: note: previous declaration of ‘ValueArray’ was here
7 | } ValueArray;
| ^~~~~~~~~~
这里是value.h:
typedef double Value;
typedef struct {
int capacity;
int count;
Value* values;
} ValueArray;
void initValueArray(ValueArray* array);
void writeValueArray(ValueArray* array, Value value);
void freeValueArray(ValueArray* array);
我查看了我的代码,没有发现 ValueArray 的任何重新声明。我做了一些研究——它似乎取决于 ValueArray 的声明时间。不过对我来说,这似乎完全没问题。
作为参考,我正在关注 Bob Nystrom's guide Crafting Interpreters,但有一些我自己的曲折。
提前致谢!
错误是
In file included from chunk.h:2,
from vm.h:1,
from compiler.h:1,
from vm.c:5:
value.h:7:3: error: conflicting types for ‘ValueArray’
7 | } ValueArray;
但接下来我们会看到这个:
In file included from chunk.h:2,
from vm.h:1,
from vm.c:4:
注意包含路径不同。
您似乎正在编译 vm.c
。 vm.c
包含 compiler.h
,最终导致 value.h
被包含。
然后您包含 vm.h
,这 也 导致 value.h
被包含。
您需要使用include guards来防止文件被多次包含:
value.h
:
#ifndef MY_VALUE_H_INCLUDED
#define MY_VALUE_H_INCLUDED
(include file contents here)
#endif
您需要选择一个唯一的标识符(在此示例中为 MY_VALUE_H_INCLUDED
)。请注意,以两个下划线 (__
) 或一个下划线和一个大写字母 (_V
) 开头的标识符将使用为实现保留的值。
你可能有循环引用,在这种情况下你需要使用forward declarations。