找回密码
 立即注册
查看: 101|回复: 10

【32G】代码中引用了库中的"DEF.h"就出现编译不过问题

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:86
  • 最近打卡:2025-04-28 11:10:46

12

主题

44

回帖

558

积分

高级会员

积分
558
发表于 2025-4-15 09:22:10 | 显示全部楼层 |阅读模式
代码中引用了库中的"DEF.h"就出现编译不过问题

Rebuild started: Project: LightingControlSystem
Rebuild target 'SW_RotaryEncoder'
compiling control_sys.c...
.\Common\inc\key.h(25): error C127: 'keyLock': member has invalid type
.\Common\inc\key.h(25): error C127: 'shortTouchFlag': member has invalid type
.\Common\inc\key.h(25): error C127: 'isLongPress': member has invalid type
.\Common\inc\key.h(25): error C127: 'isShortPress': member has invalid type
.\Common\inc\key.h(25): error C127: 'isReleaseKey': member has invalid type
compiling lamp_svc.c...
compiling main.c...
compiling sys_init.c...
compiling task.c...
.\Common\inc\key.h(25): error C127: 'keyLock': member has invalid type
.\Common\inc\key.h(25): error C127: 'shortTouchFlag': member has invalid type
.\Common\inc\key.h(25): error C127: 'isLongPress': member has invalid type
.\Common\inc\key.h(25): error C127: 'isShortPress': member has invalid type
.\Common\inc\key.h(25): error C127: 'isReleaseKey': member has invalid type
App\src\task.c(52): warning C122: '[]': unknown size
App\src\task.c(52): warning C72: sizeof returns zero
compiling lighting_mode.c...
compiling can.c...
compiling can_svc.c...
compiling delay.c...
compiling gpio.c...
compiling key.c...
.\Common\inc\key.h(25): error C127: 'keyLock': member has invalid type
.\Common\inc\key.h(25): error C127: 'shortTouchFlag': member has invalid type
.\Common\inc\key.h(25): error C127: 'isLongPress': member has invalid type
.\Common\inc\key.h(25): error C127: 'isShortPress': member has invalid type
.\Common\inc\key.h(25): error C127: 'isReleaseKey': member has invalid type
compiling led.c...
compiling nvic.c...
compiling ring_buffer.c...
compiling rs485.c...
compiling timer.c...
compiling uart.c...
compiling eeprom.c...
compiling clock.c...
compiling pwm.c...
compiling rotary_encoder.c...
Target not created.
Build Time Elapsed:  00:00:02


key.h的定义
  1. typedef struct KeyInfo
  2. {
  3.     u8 keyCode;
  4.     u16 keyTimeCnt;      // 按键去抖动延时计数器
  5.     u16 keyUpTimeCnt;    // 松开按键时间
  6.     BOOL keyLock;        // 按键触发后自锁的变量标记
  7.     BOOL shortTouchFlag; // 短按触发标记
  8.     BOOL isLongPress;    // 是否长按
  9.     BOOL isShortPress;   // 是否短按
  10.     BOOL isReleaseKey;   // 是否松开
  11. } KeyInfo_t;
复制代码



但是只要将DEF.H中的
typedef bit                     BOOL;
修改为

typedef unsigned char          BOOL;

就可以正常编译,是因为官方的库定义出错还是什么原因;keil不支持typedef bit 的定义问题








回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-15 09:23:00 | 显示全部楼层
在您提供的编译错误信息中,主要问题集中在key.h文件中,具体表现为多个成员变量的类型无效。以下是对该问题的详细分析和可能的解决方案:

问题分析
1. 错误类型:error C127表示编译器在解析结构体或联合体时,发现成员变量的类型无效。这通常是由于类型定义缺失、类型定义错误或头文件包含顺序不当导致的。

2. 具体错误:
keyLock、shortTouchFlag、isLongPress、isShortPress、isReleaseKey等成员变量的类型被编译器识别为无效。

3. 可能原因:
类型定义缺失:key.h中使用的某些类型可能未在DEF.h或其他相关头文件中正确定义。
头文件包含顺序:如果key.h在包含DEF.h之前引用了某些类型,而这些类型在DEF.h中定义,可能会导致类型未定义错误。
类型定义冲突:可能存在多个头文件中定义了相同名称但不同类型的变量,导致编译器无法正确识别。

解决方案
1. 检查类型定义:
确保key.h中使用的所有类型在DEF.h或其他相关头文件中正确定义。例如,如果keyLock等变量是bool类型,确保DEF.h中包含了stdbool.h或定义了bool类型。

2. 调整头文件包含顺序:
确保DEF.h在key.h之前被包含。例如,在key.h的开头添加#include "DEF.h",以确保所有类型定义在key.h中使用之前已经存在。

3. 避免类型定义冲突:
检查项目中是否存在多个头文件定义了相同名称但不同类型的变量。如果有,建议统一类型定义或使用命名空间来避免冲突。

4. 编译器设置:
检查编译器设置,确保编译器支持所使用的类型。例如,某些编译器可能需要特定的编译选项来支持C99或C11标准中的类型。

示例代码调整
假设key.h中使用了bool类型,以下是调整后的示例代码:
  1. c
  2. // key.h
  3. ifndef KEYH
  4. define KEYH
  5. include "DEF.h"  // 确保DEF.h在key.h之前被包含
  6. typedef struct {
  7.     bool keyLock;
  8.     bool shortTouchFlag;
  9.     bool isLongPress;
  10.     bool isShortPress;
  11.     bool isReleaseKey;
  12. } KeyState;
  13. endif // KEYH
复制代码

总结
通过检查类型定义、调整头文件包含顺序、避免类型定义冲突以及检查编译器设置,可以有效解决error C127编译错误。如果问题仍然存在,建议进一步检查项目中的其他头文件和编译器设置,确保所有类型定义和包含顺序正确无误。

[本文内容由国芯人工智能辅助生成,仅供参考]

点评

是关于typedef bit BOOL;定义的问题引起的,不是你这个说法  发表于 2025-4-15 09:32
回复 支持 0 反对 1

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-15 09:23:00 | 显示全部楼层
针对您在编译过程中遇到的错误,以下是一些可能的原因及解决方案:

1. 头文件包含问题
问题描述:错误信息显示在key.h文件中,多个成员变量被报告为“invalid type”。这可能是由于DEF.h头文件中未正确定义相关类型,或者key.h中引用的类型在DEF.h中未正确声明。
解决方案:
检查DEF.h文件,确保其中定义了key.h中使用的所有类型。例如,如果key.h中使用了uint8t、bool等类型,确保DEF.h中包含了相应的标准头文件(如`、)。
确保DEF.h文件在key.h之前被正确包含。可以在key.h的开头添加#include "DEF.h",或者在key.h中显式声明所需类型。

2. 类型定义冲突
问题描述:如果DEF.h中定义的类型与key.h中使用的类型不一致,可能会导致编译错误。例如,key.h中可能使用了bool类型,而DEF.h中未定义或定义了不同的bool类型。
解决方案:
检查key.h和DEF.h中的类型定义,确保它们一致。如果DEF.h中未定义bool类型,可以在key.h中显式定义:
      
  1. c
  2.        #ifndef bool
  3.        #define bool uint8t
  4.        #endif
复制代码
如果DEF.h中定义了与key.h冲突的类型,建议统一使用标准类型定义。

3. 编译器兼容性问题
问题描述:某些编译器可能对类型定义有特殊要求,或者对头文件的包含顺序敏感。如果编译器无法正确解析DEF.h中的类型定义,可能会导致key.h中的成员变量类型无效。
解决方案:
确保编译器支持DEF.h中使用的所有类型。如果编译器不支持某些类型,可以尝试使用替代类型或自定义类型。
检查编译器的版本和配置,确保其与STC32G芯片的开发环境兼容。

4. 代码结构问题
问题描述:如果key.h文件中的结构体或变量定义依赖于DEF.h中的类型,但DEF.h未正确包含或定义,可能会导致编译错误。
解决方案:
确保key.h文件中的结构体或变量定义依赖于DEF.h中的类型时,DEF.h已正确包含。可以在key.h的开头添加#include "DEF.h"。
如果key.h中的结构体或变量定义依赖于其他头文件,确保这些头文件也已正确包含。

5. 编译环境配置问题
问题描述:编译环境可能未正确配置,导致编译器无法找到DEF.h文件或无法正确解析其中的内容。
解决方案:
检查编译环境的包含路径,确保DEF.h文件所在的目录已添加到包含路径中。
如果DEF.h文件位于项目目录的子目录中,确保在包含时使用正确的相对路径。例如,如果DEF.h位于Common/inc目录中,可以使用#include "Common/inc/DEF.h"。

6. 代码清理与重建
问题描述:有时编译错误可能是由于编译缓存或临时文件导致的,清理项目并重新编译可能会解决问题。
解决方案:
清理项目编译缓存,删除所有生成的中间文件和目标文件。
重新编译项目,确保所有文件都从头开始编译。

总结
通过以上步骤,您应该能够定位并解决key.h文件中成员变量类型无效的问题。如果问题仍然存在,建议逐步排查DEF.h和key.h`中的类型定义,确保它们一致且正确。同时,检查编译环境的配置,确保编译器能够正确解析所有头文件和类型定义。

希望这些建议能帮助您顺利解决编译问题。如果还有其他疑问,欢迎继续讨论。

[本文内容由国芯人工智能辅助生成,仅供参考]

点评

目前定义问题是在typedef bit BOOL;定义引用的  发表于 2025-4-15 09:31
回复 支持 0 反对 1

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-4-15 11:06:31 | 显示全部楼层
你的排查有点草率噢,可以上传工程我看下

截图202504151105572735.jpg
截图202504151106176336.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-4-15 11:09:53 | 显示全部楼层
bit作为独立变量使用,放在结构体中会报错
截图202504151109151257.jpg
截图202504151109503527.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:86
  • 最近打卡:2025-04-28 11:10:46

12

主题

44

回帖

558

积分

高级会员

积分
558
发表于 2025-4-15 12:26:02 | 显示全部楼层
erci*** 发表于 2025-4-15 11:09
bit作为独立变量使用,放在结构体中会报错

是的,原来自定义的部分关于BOOL的参照C标准的stdbool定义的是char类型的,当时也是放在结构体中使用,最后更新下头文件,看引用报错,所以想看看是不是定义哪里问题,常规作为变量使用STC库中的DEF.H定义BOOL是没问题

点评

这个应该是编译器或者C89标准限制的。结构体里改回u8用吧  详情 回复 发表于 2025-4-15 13:39
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:86
  • 最近打卡:2025-04-28 11:10:46

12

主题

44

回帖

558

积分

高级会员

积分
558
发表于 2025-4-15 12:28:01 | 显示全部楼层
erci*** 发表于 2025-4-15 11:06
你的排查有点草率噢,可以上传工程我看下

key.h的定义,也是报错的信息的部分
  1. #ifndef __KEY_H__
  2. #define __KEY_H__
  3. #include "stc.h"
  4. #include "project_conf.h"
  5. #ifdef HAS_KEYS
  6. #define SHORT_PRESS_KEY_TIME 60  // 按键短按去抖动延时时间
  7. #define LONG_PRESS_KEY_TIME 2000 // 按键长按去抖动延时时间
  8. #define KeyUp 1
  9. // #define KeyDown 0
  10. typedef struct KeyInfo
  11. {
  12.     u8 keyCode;
  13.     u16 keyTimeCnt;      // 按键去抖动延时计数器
  14.     u16 keyUpTimeCnt;    // 松开按键时间
  15.     BOOL keyLock;        // 按键触发后自锁的变量标记
  16.     BOOL shortTouchFlag; // 短按触发标记
  17.     BOOL isLongPress;    // 是否长按
  18.     BOOL isShortPress;   // 是否短按
  19.     BOOL isReleaseKey;   // 是否松开
  20. } KeyInfo_t;
  21. void keyInit(void);
  22. /**
  23. * @brief 按键扫描
  24. * @retval 长按与短按的按键扫描过程
  25. * 第一: 平时只要按键没有按下时,按键的自锁标志,去抖动延时计数器一直被清零
  26. * 第二: 一旦按键被按下,去抖动延时计数器开始在定时器中断函数累加,
  27. *       在还没累加到阀值SHORT_PRESS_KEY_TIME或LONG_PRESS_KEY_TIME时,
  28. *       如果在这期间由于受外部干扰或者按键抖动,而使IO口突然瞬间触发成高电平,
  29. *       此时马上把延时计数器keyTimeCnt1清零了,此过程非常巧妙,非常有效地去除瞬间的杂波干扰。
  30. * 第三: 如果按键按下的时间超过了短按阀值SHORT_PRESS_KEY_TIME,则马上把短按标志shortTouchFlag1设为1;
  31. *       如果还没松手,一旦发现按下的时间超过长按阀值LONG_PRESS_KEY_TIME时,先把短按标记
  32. *       shortTouchFlag1清零, 然后触发长按。在此过程中,将自锁标志shortTouchFlag1置位,
  33. *       防止按住按键不枪手后一直触发。
  34. * 第四: 等待按键松开后,自锁标志shortTouchFlag1及时清零,为下一次自锁做准备,
  35. *       如果发现shortTouchFlag1等于1,说明短按有效,此时触发一次短按
  36. * 第五: 以此整个过程是识别按键IO口下降边沿触发的过程
  37. */
  38. void keyScan(void);
  39. /**
  40. * @brief 按键服务函数
  41. * 根据扫描得到的值并处理
  42. */
  43. void keyService(void);
  44. void Key_onClick(const u8 keyCode);
  45. void Key_onLongPress(const u8 keyCode);
  46. #endif
  47. #endif // __KEY_H__
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-4-15 13:39:29 来自手机 | 显示全部楼层
jacksonjim 发表于 2025-4-15 12:26
是的,原来自定义的部分关于BOOL的参照C标准的stdbool定义的是char类型的,当时也是放在结构体中使用,最 ...

这个应该是编译器或者C89标准限制的。结构体里改回u8用吧.
不要修改全局BOOL定义。否则可能导致USB库等使用异常。
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:86
  • 最近打卡:2025-04-28 11:10:46

12

主题

44

回帖

558

积分

高级会员

积分
558
发表于 3 天前 | 显示全部楼层
erci*** 发表于 2025-4-15 13:39
这个应该是编译器或者C89标准限制的。结构体里改回u8用吧.
不要修改全局BOOL定义。否则可能导致USB库等使 ...

回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 19:39 , Processed in 0.305132 second(s), 104 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表