keil 提示 error:#65:expected a “;”

当在Keil中编程时,如果主函数调用的子函数没有在它前面声明,会导致#65错误和源代码解析警告。确保所有子函数在被调用前都有相应的原型声明,可以避免这类问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个报错keil 提示 error:#65:expected “a ”;一个警告main.c(29): warning: At end of source: #12-D: parsing restarts here after previous syntax error。

原因,在你编写一个主函数,有时候需要写一个子函数,如果子函数写在主函数之后,主函数在调用子函数时,如果子函数没有在主函数之前进行声明,就会出现这样的问题。

Build started: Project: DUOJI *** Using Compiler 'V5.06 update 7 (build 960)', folder: 'D:\Keil_v5\ARM\ARMCC\Bin' Build target 'DUOJI' compiling main.c... ../Core/Src/main.c(133): error: #65: expected a ";" { ../Core/Src/main.c(155): warning: #12-D: parsing restarts here after previous syntax error Error_Handler(); ../Core/Src/main.c(70): warning: #177-D: variable "dir" was declared but never referenced uint8_t dir=1; ../Core/Src/main.c(160): error: #77-D: this declaration has no storage class or type specifier RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK ../Core/Src/main.c(160): error: #65: expected a ";" RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK ../Core/Src/main.c(162): error: #77-D: this declaration has no storage class or type specifier RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; ../Core/Src/main.c(162): error: #65: expected a ";" RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; ../Core/Src/main.c(163): error: #77-D: this declaration has no storage class or type specifier RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; ../Core/Src/main.c(163): error: #65: expected a ";" RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; ../Core/Src/main.c(164): error: #77-D: this declaration has no storage class or type specifier RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; ../Core/Src/main.c(164): error: #65: expected a ";" RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; ../Core/Src/main.c(165): error: #77-D: this declaration has no storage class or type specifier RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; ../Core/Src/main.c(165): error: #65: expected a ";" RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; ../Core/Src/main.c(167): error: #169: expected a declaration if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) ../Core/Src/main.c(207): warning: At end of source: #12-D: parsing restart
03-26
Build started: Project: F103 *** Using Compiler &#39;V5.06 update 5 (build 528)&#39;, folder: &#39;D:\keil5 mdk\ARM\ARMCC\Bin&#39; Build target &#39;F103&#39; compiling oled.c... ..\Source\oled.c(485): error: #254: type name is not allowed for (u8 i = 0; i < 8; i++) ..\Source\oled.c(485): error: #65: expected a ";" for (u8 i = 0; i < 8; i++) ..\Source\oled.c(485): error: #20: identifier "i" is undefined for (u8 i = 0; i < 8; i++) ..\Source\oled.c(495): error: #254: type name is not allowed for (u8 n = 0; n < 128; n++) ..\Source\oled.c(495): error: #65: expected a ";" for (u8 n = 0; n < 128; n++) ..\Source\oled.c(495): error: #20: identifier "n" is undefined for (u8 n = 0; n < 128; n++) ..\Source\oled.c(630): error: #254: type name is not allowed for (uint16_t i = 0; i < size3; i++) ..\Source\oled.c(630): error: #65: expected a ";" for (uint16_t i = 0; i < size3; i++) ..\Source\oled.c(630): error: #20: identifier "i" is undefined for (uint16_t i = 0; i < size3; i++) ..\Source\oled.c(691): error: #254: type name is not allowed for (u8 t = 0; t < csize; t++) ..\Source\oled.c(691): error: #65: expected a ";" for (u8 t = 0; t < csize; t++) ..\Source\oled.c(691): error: #20: identifier "t" is undefined for (u8 t = 0; t < csize; t++) ..\Source\oled.c(699): error: #254: type name is not allowed for (u8 t1 = 0; t1 < 8; t1++) ..\Source\oled.c(699): error: #65: expected a ";" for (u8 t1 = 0; t1 < 8; t1++) ..\Source\oled.c(699): error: #20: identifier "t1" is undefined for (u8 t1 = 0; t1 < 8; t1++) ..\Source\oled.c(738): error: #254: type name is not allowed for (u8 t = 0; t < csize; t++) ..\Source\oled.c(738): error: #65: expected a ";" for (u8 t = 0; t < csize; t++) ..\Source\oled.c(738): error: #20: identifier "t" is undefined for (u8 t = 0; t < csize; t++) ..\Source\oled.c(741): error: #254: type name is not allowed for (u8 t1 = 0; t1 < 8;
03-27
<think>好的,我现在需要帮助用户解决Keil ARMCC V5.06编译OLED.c文件时报出的#254、#65#20错误,尤其是涉及u8、uint16_t和for循环变量未定义的问题。首先,我得分析这些错误代码的含义,然后结合用户提供的引用信息来找到解决方案。 首先,查看错误代码的含义: - #254:通常表示“类型不匹配”或“无效的类型转换”。 - #65:可能表示“期望一个声明”或“语法错误”。 - #20:标识符未定义,常见于变量或类型未声明的情况。 用户提到的问题包括u8和uint16_t未定义,以及for循环变量未定义。这提示可能存在头文件缺失或语法不符合C89标准的问题,因为ARMCC V5默认可能使用C89标准,而C89要求在for循环之外声明变量。 根据用户提供的引用[2],C89下for循环内声明变量会导致编译失败,比如`for(int i=0;;)`在C89是不允许的,变量i必须在循环外声明。因此,用户代码中的for循环可能使用了C99风格的变量声明,导致#20错误(变量未定义),因为编译器在C89模式下无法识别这种语法。 接下来,关于u8和uint16_t未定义的问题,这些类型通常是typedef定义在头文件中的,比如stdint.h或用户自定义的头文件。如果用户没有包含正确的头文件,或者编译器不支持这些类型,就会导致#20错误。需要检查是否包含了<stdint.h>或类似的头文件,或者是否在代码中正确定义了这些类型。 解决方案可能包括: 1. 添加必要的类型定义,如包含stdint.h或手动定义u8和uint16_t。 2. 修改for循环的变量声明方式,将变量定义放在循环外部,以符合C89标准。 3. 检查编译器设置,确认是否使用了正确的C标准,或者尝试切换到支持C99模式的编译器选项(但ARMCC V5可能不支持C99)。 此外,引用[3]提到ARM Compiler 5的-O0实际上有优化,可能需要调整优化级别,但可能和当前错误无关。引用[4]中的宏定义可能涉及硬件配置,但除非OLED.c依赖这些宏,否则可能不直接相关。 总结步骤: 1. 包含stdint.h以获取uint16_t的定义,或手动定义u8和uint16_t。 2. 确保所有变量在使用前声明,特别是for循环中的变量。 3. 检查代码中是否存在其他C99语法,如单行注释(//)等,并修改为C89兼容的格式。 需要验证用户代码中是否存在这些情况,并逐一修正。同时,可能需要在Keil中调整编译器选项,如果允许的话,但ARMCC V5可能不支持C99,所以最好修改代码以适应C89标准。</think>针对Keil ARMCC V5.06编译OLED.c报错的问题,以下是分步解决方案: ### **错误分析** 1. **#20错误(标识符未定义)** - `u8`/`uint16_t`未定义:需确认是否包含标准头文件或自定义类型定义 - `for`循环变量未定义:编译器可能采用C89标准,不支持循环内声明变量[^2] 2. **#65错误(语法错误)** - 可能由未定义类型导致的连锁反应(如`u8`未定义时,相关变量声明会触发语法错误) 3. **#254错误(类型不匹配)** - 可能由隐式类型转换引起(如未正确定义`u8`时,编译器无法识别类型) --- ### **解决方案** #### **步骤1:添加标准类型定义** - **包含`stdint.h`头文件**: ```c #include <stdint.h> // 定义uint16_t等标准类型 ``` - **若未使用标准库,手动定义类型**: ```c typedef unsigned char u8; typedef unsigned short uint16_t; ``` #### **步骤2:修正C89不兼容的循环语法** - **修改前(C99风格)**: ```c for(int i=0; i<10; i++){ ... } ``` - **修改后(C89兼容)**: ```c int i; // 将变量声明移至循环外 for(i=0; i<10; i++){ ... } ``` #### **步骤3:检查其他C99语法** - **替换单行注释`//`为多行注释`/**/`**: ```c /* 错误示例:C89不支持单行注释 */ // u8 value = 0; /* 正确示例 */ /* u8 value = 0; */ ``` #### **步骤4:验证编译器设置** 1. **关闭严格C89检查(可选)**: - 在Keil工程选项中添加`--c99`标志(但ARMCC V5可能不支持完全C99特性) 2. **优化级别调整**: - 调试阶段使用`-O0`或`-O1`优化级别以降低干扰[^3] --- ### **示例修正代码** ```c #include <stdint.h> // 解决uint16_t未定义问题 typedef unsigned char u8; // 自定义u8类型 void OLED_Init(void) { uint16_t i; // 提前声明变量 for(i=0; i<100; i++){ // C89兼容写法 /* 操作代码 */ } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值