#268: declaration may not appear after executable statement in block 另类错误原因

本文详细记录了解决Keil开发环境中LPC17xx.H、stdint.h、core_cm3.h文件引发的编译警告和错误的过程。通过检查Uuart.c文件,最终定位到问题源于文件引入的意外引用。文章提供了解决此类问题的方法,包括检查和修正特定代码段,以及理解错误信息背后的含义。
AI助手已提取文章相关产品:
Code_LPC1700\Driver\Uuart.c(958): warning:  #550-D: variable "uiState" was set but never used
C:\Keil\ARM\INC\NXP\LPC17xx\LPC17xx.H(31): error:  #268: declaration may not appear after executable statement in block
C:\Keil\ARM\RV31\INC\stdint.h(43): error:  #268: declaration may not appear after executable statement in block
Code_LPC1700\Driver\Uuart.c(1104): warning:  #177-D: variable "sendlen" was declared but never referenced
Code_LPC1700\Driver\Uuart.c(1104): warning:  #177-D: variable "num" was declared but never referenced
Code_LPC1700\Driver\Uuart.c(1105): warning:  #177-D: variable "ap" was declared but never referenced
C:\Keil\ARM\RV31\INC\stdint.h(43): error:  #67: expected a "}"
C:\Keil\ARM\RV31\INC\stdint.h(51): error:  #256: invalid redeclaration of type name "uint32_t" (declared at line 36 of ".\Code_LPC1700\UserAPP\includes.h")
C:\Keil\ARM\RV31\INC\core_cm3.h(156): error:  #40: expected an identifier
C:\Keil\ARM\RV31\INC\core_cm3.h(156): error:  #18: expected a ")"
C:\Keil\ARM\RV31\INC\core_cm3.h(157): error:  #40: expected an identifier
C:\Keil\ARM\RV31\INC\core_cm3.h(157): error:  #18: expected a ")"
C:\Keil\ARM\RV31\INC\core_cm3.h(158): error:  #40: expected an identifier
C:\Keil\ARM\RV31\INC\core_cm3.h(158): error:  #18: expected a ")"
C:\Keil\ARM\RV31\INC\core_cm3.h(159): error:  #40: expected an identifier
C:\Keil\ARM\RV31\INC\core_cm3.h(159): error:  #18: expected a ")"
C:\Keil\ARM\RV31\INC\core_cm3.h(160): error:  #40: expected an identifier
C:\Keil\ARM\RV31\INC\core_cm3.h(160): error:  #18: expected a ")"
C:\Keil\ARM\RV31\INC\core_cm3.h(162): error:  #40: expected an identifier
C:\Keil\ARM\RV31\INC\core_cm3.h(162): error:  #18: expected a ")"
C:\Keil\ARM\RV31\INC\core_cm3.h(163): error:  #40: expected an identifier
C:\Keil\ARM\RV31\INC\core_cm3.h(163): error:  #18: expected a ")"
C:\Keil\ARM\RV31\INC\core_cm3.h(164): error:  #40: expected an identifier
C:\Keil\ARM\RV31\INC\core_cm3.h(164): error:  #18: expected a ")"
C:\Keil\ARM\RV31\INC\core_cm3.h(165): error:  #40: expected an identifier
C:\Keil\ARM\RV31\INC\core_cm3.h(165): error:  #18: expected a ")"
C:\Keil\ARM\RV31\INC\core_cm3.h(166): error:  #40: expected an identifier
C:\Keil\ARM\RV31\INC\core_cm3.h(166): error:  #18: expected a ")"
C:\Keil\ARM\RV31\INC\core_cm3.h(167): error:  #40: expected an identifier
C:\Keil\ARM\RV31\INC\core_cm3.h(167): error:  #18: expected a ")"
C:\Keil\ARM\RV31\INC\core_cm3.h(1067): error:  #134: expected a field name
C:\Keil\ARM\RV31\INC\core_cm3.h(1070): error:  #134: expected a field name
C:\Keil\ARM\RV31\INC\core_cm3.h(1084): error:  #134: expected a field name
C:\Keil\ARM\RV31\INC\core_cm3.h(1096): error:  #20: identifier "IRQn_Type" is undefined

Target not created


以下错误:消耗了我10个小时,特止留印,备查


开始我一直在LPC17xx.H,stdint.h,core_cm3.h 三个文件中找
并发现凡是以 "typedef" 开头的地方都报错,以为找到问题了,就一直在查这个typedef
认为可能是程序的配置上有问题,由是就按能正常运行的文件配了N次,结果还时不行,
这时想到了把他们的工程文件 UCOSii_LPC1700.uvproj,互换一下试一下,结果还是一样
既然配置一样了,工程文件也一样了,都不行,那么源文件我交换试一下呢,然后依次交换源
文件夹,在交换到Driver文件夹时,出现了一个读入Uuart.c文件的提示,难道说之前的Uuart.c文件没有读入?
我打开原来的Driver文件夹,看到Uuart.c文件是在这个文件里的都嘛,由于我反复替换Uuart.c文件,发现
确实是Uuart.c文件引起的错误,于是打开Uuart.c文件来看,这才终于找到了问题的原因.


我都无力吐糟了,这是什么错误,提示错误在B文件,实际错误在A文件,而且这个A文件是什么时候改的啊,我晕,



在:Code_LPC1700\Driver\Uuart.c文件的这个函数中,
void Uart_Printf(char *fmt,...)
{
    uint8 SemErr;
  uint16 sendlen,num;    
    va_list ap;


OSSemPend(PORTsendsemcount,800, &SemErr); 
#include <LPC17xx.H>                                    //错误在这里,这个地方是什么时候被插入了一个引用啊!!!!,吐血啊
    va_start(ap,fmt);
    vsprintf(uart_string,fmt,ap);
sendlen=strlen(uart_string);
num=uartFifoStatus(UART0,TX_FIFO);
if((num>0) && (num<sendlen)) while(uartFifoStatus(UART0,TX_FIFO)<sendlen);
    uartWrite(UART0, (uint8*)uart_string, sendlen, NULL);
while(uartFifoStatus(UART0,TX_FIFO)<sendlen);
    va_end(ap);
//OSTimeDly(OS_TICKS_PER_SEC/200);
OSSemPost(PORTsendsemcount);
}

您可能感兴趣的与本文相关内容

<think> 首先,用户的问题是查找错误代码 #268 的解决方案:"declaration may not appear after executable statement in block"。根据系统指令,我需要使用中文回答,结构清晰,并生成相关问题。 从引用中,我提取关键信息: - 引用[1]:提到在Keil5中编译时出现这个错误,解决方法是检查代码。 - 引用[2]:解释错误是由于C90标准不允许在可执行语句后声明变量,C99标准放宽了这个限制。 - 引用[3]:展示了具体的错误位置。 用户上一次的问题是关于同一个错误代码的解决方案,所以我需要基于这些信息提供解决方案。 核心问题:错误 #268 是由于在代码块中,变量声明出现在可执行语句之后。这在C90标准中是禁止的;C99标准允许在任何地方声明变量。 解决方案步骤: 1. **检查编译器标准**:确保编译器支持C99或更高版本。如果是Keil或其他IDE,检查编译器设置。 2. **修改代码**:将变量声明移到代码块的顶部(在第一个可执行语句之前)。 3. **启用C99模式**:如果在旧编译器上,尝试切换到C99标准。 在我的回答中,我应该: - 解释错误原因。 - 提供具体的解决步骤。 - 结构清晰:逐步引导解决。 - 确保LaTeX语法正确:所有行内数学使用$...$,独立公式使用$$...$$。但这里不需要数学公式,因为主题是编程错误。 - 添加引用标识:在相关段落末尾添加 [^1], [^2], [^3]。 - 生成相关问题:在最后添加相关问题部分。 引用来源: - [^1] 来自引用[1],提到解决方法。 - [^2] 来自引用[2],解释C标准差异。 - [^3] 来自引用[3],示例错误位置。 用户说“上述引用仅供参考”,但我要参考它们来回答。 回答结构: 1. **解释错误**:简要说明错误原因。 2. **提供解决方案**:逐步列出解决步骤。 3. **示例**:给出一个简单的代码示例来展示修正前后。 4. **生成相关问题**:添加相关问题部分。 完整回答: - 开头:直接回答问题。 - 主体:步骤清晰。 - 结尾:相关问题。 相关问题建议(§§相关问题§§): 1. 如何更改Keil编译器的C标准? 2. 什么是C语言的不同标准(如C90、C99、C11)的差异? 3. 其他常见C语言编译错误及解决方案? 最终输出: </think> ### 错误代码 #268: "declaration may not appear after executable statement in block" 的解决方案 错误代码 #268 表示在 C 语言的代码块中,变量声明被放置在可执行语句(如赋值、函数调用等)之后,这违反了 C90 标准的规定。从 C99 标准开始,这种限制被放宽,允许在代码块的任何位置声明变量。该错误常见于旧版编译器或环境(如 Keil5),需要检查编译器设置和代码结构来解决[^2]。以下是详细的解决步骤,结构清晰,逐步操作。 #### 解决方案步骤 1. **检查并更新编译器标准**: - 确保您的编译器支持 C99 或更高标准(如 C11)。在 Keil5 中: - 打开项目设置(Project > Options for Target)。 - 转到 "C/C++" 选项卡,在 "Language" 部分选择 "C99" 或 "gnu99"。 - 保存并重新编译。如果错误消失,则问题源于编译器默认使用 C90 标准[^2]。 2. **修改代码结构**: - 将所有变量声明移到代码块的顶部(即出现在任何可执行语句之前)。 - 错误示例(违反 C90): ```c void myFunction() { int a = 10; // 可执行语句(赋值) int b; // 声明出现在可执行语句后,导致错误 #268 b = a + 5; } ``` - 修正后示例(兼容 C90/C99): ```c void myFunction() { int b; // 声明移到顶部 int a = 10; // 可执行语句 b = a + 5; } ``` - 在您的代码中,定位错误文件(如 `main.c` 或 `Seg_Dis.c`),并移动相关声明[^1][^3]。 3. **启用编译器扩展或更新工具链**: - 如果无法切换到 C99(例如,在嵌入式环境中),启用编译器扩展: - 在 Keil 的 "C/C++" 选项卡中,添加编译选项如 `--std=c99` 或 `-xc99`。 - 或者,更新 Keil MDK 或编译器版本到最新版,以支持现代标准。 - 如果错误伴随其他问题(如不完整类型错误),优先解决所有语法错误,因为一个错误可能引发连锁反应[^3]。 4. **验证和测试**: - 编译后,如果错误未解决,使用调试工具(如 Keil 的语法检查器)逐行检查错误位置。 - 确保代码中无其他语法问题(如缺失分号或不完整类型),这些可能被误报为 #268 错误[^3]。 #### 注意事项 - **原因分析**:该错误源于 C90 的严格性,要求变量声明必须在代码块开头。这在嵌入式开发中常见,因为许多旧设备默认使用 C90。切换到 C99 不仅解决此问题,还能提高代码灵活性[^2]。 - **成功率**:以上方法在常见环境(如 Keil、IAR)中有效。如果问题持续,建议检查相关头文件或库是否兼容您的编译器标准。 如果这些步骤未解决您的问题,请提供具体的代码片段(如错误行号),我会为您进一步分析。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值