[求助] .h文件中的函数参数使用自定义类型报错:error: #20

2019-12-27 18:56发布

本帖最后由 Joetu 于 2017-6-11 08:27 编辑

(一) [问题描述]:
(1) 在项目头文件 A.h中声明了一个"enum 类型";  B.h引用了头文件A.h.   在B.h中声明函数,函数使用A.h中声明的类型作为函数参数,MDK中编译出错,错误提示 : ...h(41): error:  #20: identifier "XXXX" is undefined ;  "XXXX"为A.h中声明的类型.
(2) "自定义类型"不仅限于 enum, 如struct 类型也会出现这样的问题.
(3) B.h肯定包含了A.h, paths中也肯定包含了A B 的路径; 在B.c文件里的函数的内部使用A.h中声明的类型没有问题,如在B.c 函数内部定义一个A.h中声明的结构体类型的局部变量,

(二) A.h
error.png (11.44 KB, 下载次数: 0) 下载附件 2017-6-10 17:52 上传

(五) 环境
编译环境: MDK-ARM 5.22
文件类型: UTF-8

恳请大神指导...

(五) 测试的项目文件
includes.h 文件在ucosii->config
F407_UCOSII_TMP.zip (1005.19 KB, 下载次数: 2) 2017-6-11 08:26 上传 点击文件名下载附件

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
security
1楼-- · 2019-12-27 20:45
本帖最后由 security 于 2017-6-12 09:01 编辑

给你说几点吧:
1、首先不建议提供 includes.h 这样全包的头文件,这样的一个副作用,是你对依赖关系不清晰,偷懒,干脆不管三七二十一,不相关的模块,也一并引入进来,导致编译速度的变慢(在工程量小的情况下,看不出什么差异)。
2、你看 includes.h 中引用了 A.h,A.h 中又引用了  includes.h,这样的依赖关系,我已经混乱了,到底是先有鸡,还是先有蛋。

一句话,就是不要用 includes.h 这样全包的头文件,这是偷懒的做法,对此,ucos 要负责,被带坏了。
jlhgold
2楼-- · 2019-12-27 23:57
是不是没有把文件所在路径添加到编译选项里?
Joetu
3楼-- · 2019-12-28 01:45
我已经在c/c++ 的paths 中添加了文件路径,检查了很多遍,而且在MDK中右键该自定义类型,go to definition也是可以找到的
Joetu
4楼-- · 2019-12-28 03:31

snipaste20170610_201235.png (11.42 KB, 下载次数: 0)

下载附件

2017-6-10 20:12 上传

jemmy
5楼-- · 2019-12-28 07:57
 精彩回答 2  元偷偷看……
Joetu
6楼-- · 2019-12-28 10:54
本帖最后由 Joetu 于 2017-6-11 08:20 编辑

       问题点似乎找到了,我使用的是ucos,由于项目有文件多,所以我把所有对外开放的文件的头文件加入了一个"includes.h" 中,然后这些头文件又都添加了这个头文件"includes.h". 现在我在"includes.h"中注释掉对B.h的引用就不报错了.
      但是我还是不明白问题的原因: ① 我的某个头文件存在错误,所以导致这种情况? ② 头文件语法等上面没有问题, 而是我的项目框架存在问题,导致编译时"顺序不对?"(没有研究过编译问题,)

一周热门 更多>