微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

错误:指向相同声明的 xxx 类型冲突

如何解决错误:指向相同声明的 xxx 类型冲突

我最近一直在写一点 C。我没有太多经验将所有内容都放入标题中,编写它们的实现等 - 但我认为我已经足够了解了。至少,直到今天:P

长话短说 - 我收到了“ValueArray 类型冲突”的错误 - 但它指向我之前声明的同一行。

它对同一文件中的少数声明重复此操作,然后也在另一个文件中进行声明。

附言该错误在 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.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.c:4:

注意包含路径不同。

看起来您正在编译 vm.cvm.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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。