IAR的编译错误:Error[Pe070]: incomplete type is not allowed

在使用IAR开发STM8S的过程中遇到编译错误Error[Pe070],原因是函数名包含短横线。通过将函数名中的短横线替换为下划线,例如将'Led-Reverse'改为'Led_Reverse',成功解决了编译问题。

IAR的编译错误:Error[Pe070]: incomplete type is not allowed

只是想记录一个IAR开发STM8S时,发现的一个小错误。
在头文件中定义一个函数,编译时报错。
界面如下:

void Led-Reverse(led_t led);

在这里插入图片描述
经过调试,发现是函数名不能有短横线“-”,改成下划线“_”,即void Led_Reverse(led_t led);

编译,OK。

在C语言编程中,遇到 `error #70: incomplete type is not allowed` 这类错误通常与结构体或联合体的声明和使用方式有关。特别是在嵌入式系统或硬件相关的编程中,这类问题更为常见。 ### 错误原因分析 1. **未完整定义的结构体或联合体**: - 如果在声明结构体或联合体时仅使用了标签(tag)而没有实际定义其成员,则编译器无法确定该类型的大小和布局,从而导致此错误。 - 例如,以下代码会触发此错误: ```c struct MyStruct; // 声明但未定义 struct MyStruct myVar; // 错误incomplete type is not allowed ``` 2. **前向声明但未包含头文件**: - 如果在一个文件中使用了结构体指针(如 `struct MyStruct *ptr;`),并且该结构体的完整定义在另一个头文件中,但未正确包含该头文件,则可能导致此问题。 3. **匿名结构体或联合体**: - 在某些编译器中,如果尝试定义一个没有名称的结构体或联合体,并直接声明变量,可能会导致此错误。 - 示例: ```c struct { int a; } var1, var2; var1 = var2; // 某些编译器可能报错 ``` 4. **硬件寄存器结构体定义不完整**: - 在嵌入式开发中,常通过结构体映射硬件寄存器地址。若结构体成员未完全对应硬件寄存器布局,或者某些字段缺失,也可能引发此错误。 ### 解决方法 1. **确保结构体或联合体完整定义**: - 在使用结构体或联合体变量之前,必须提供完整的定义。 - 修改示例: ```c struct MyStruct { int a; float b; }; struct MyStruct myVar; // 正确 ``` 2. **检查头文件包含情况**: - 确保所有涉及结构体定义的头文件都已正确包含。 - 使用 `#include "myheader.h"` 包含自定义头文件。 3. **避免使用匿名结构体赋值**: - 如果需要复制结构体变量内容,建议使用 `memcpy()` 函数而非直接赋值。 - 示例: ```c #include <string.h> struct { int a; float b; } var1, var2; memcpy(&var1, &var2, sizeof(var2)); // 安全复制 ``` 4. **检查硬件寄存器结构体定义**: - 确保结构体成员与硬件寄存器一一对应,并且类型匹配。 - 示例: ```c typedef struct { volatile uint32_t CR; // 控制寄存器 volatile uint32_t SR; // 状态寄存器 volatile uint32_t DR; // 数据寄存器 } UART_Registers; #define UART_BASE (0x40013800) UART_Registers *uart = (UART_Registers *)UART_BASE; ``` 5. **检查编译器特定扩展或语法要求**: - 某些嵌入式编译器(如 Keil、IAR)对结构体和寄存器映射有特定语法要求,需查阅相关文档并遵循规范。 ### 编译器行为差异 不同编译器对结构体和联合体的处理方式可能存在差异,尤其是在硬件相关的上下文中。例如,在 TI 的 Code Composer Studio 或 ARM 的 Keil 编译器中,某些情况下需要额外的关键字(如 `__no_init` 或 `volatile`)来正确映射内存地址。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值