c - 错误:xxx 的冲突类型指向相同的声明
问题描述
我最近一直在写一点C。我没有太多经验将所有内容都放入标头中,编写它们的实现等 - 但我认为我知道的足够多。至少,直到今天:P
长话短说 - 我收到“ValueArray 的类型冲突”的错误 - 但它指向我之前声明的同一行。
它对同一文件中的少数声明重复此操作,然后在另一个文件中也进行声明。
PS 该错误在 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;
| ^~~~~~~~~~
这是值.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 的指南 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
被包含。
然后你 include vm.h
,这也会导致value.h
被包含。
您需要使用包含防护来防止文件的多次包含:
value.h
:
#ifndef MY_VALUE_H_INCLUDED
#define MY_VALUE_H_INCLUDED
(include file contents here)
#endif
您需要选择一个MY_VALUE_H_INCLUDED
唯一的标识符(在本例中)。请注意,以两个下划线 ( __
) 或一个下划线和一个大写字母 ( _V
) 开头的标识符将使用为实现保留的值。
您可能有循环引用,在这种情况下您需要使用前向声明。
推荐阅读
- sql - 需要通过查询验证日期跨度条件
- android - 在 InApp 计费库 [android] 的响应中检测测试购买
- python-3.x - 我的 ubuntu 服务器中的 Cron 作业无法启动
- puppet - kernel-devel 安装使用 puppet 抛出错误
- java - Whitelabel 错误页面 - 应用程序没有 /error 的显式映射
- gradle - Gradle复合构建`无法添加任务'包装器'作为具有该名称的任务已经存在。
- javascript - vue.js 元素 ui 将布尔数据绑定到选择列
- angularjs - Angular js中的当前路线
- javascript - 在 datepicker PHP 中为周末创建输出
- javascript - 如何获取剃须刀中单选按钮的值以将其作为参数传递给操作?