STM32问题解决:declaration may not appear after executable statement in block

一、问题描述

如图:在点灯的过程中想写一个for循环来实现随机数点灯功能,但是如下图第26行的代码出现了问题“declaration may not appear after executable statement in block”,翻译过来就是声明不能出现在块中的可执行语句之后。其实int i是声明语句,值得注意的是“GPIO_InitTypeDef GIIOPP”(此句的作用是定义了一个GPIO_InitTypeDef类型的结构体变量GIIOPP)也是声明语句。

二、解决方案一

将声明语句放在int main()语句下方,对于上图而言,可以把int i放在int main()的上方;或者将其放在GPIO_InitTypeDef GIIOPP的上方/下方。只需要将声明语句放在可执行语句之前。GPT的回答如下。

三、解决方案二

1、因为keil 默认编译标准是C89,将C89换成C99就行。此时声明语句的位置不影响代码执行

2、如下图:

3、C89和C99的区别


Keil是一款广泛使用的嵌入式开发工具,它提供了多种编译标准选项,包括C89和C99。

C89是指ANSI C(或称为C90)标准,在1989年发布。它是最早的C语言标准之一,定义了C语言的基本语法和特性。

C99是指C语言的第二个标准,于1999年发布。相比于C89,C99引入了一些新特性和改进,以增强C语言的表达能力和功能,提供更方便的编程方式。

C89与C99的区别主要体现在以下几个方面:

  1. 数据类型:C99引入了新的数据类型,例如long long intbool等。而C89只支持基本的数据类型。

  2. 预处理指令:C99增加了一些新的预处理指令,例如_Pragma__func__等,提供更灵活和强大的预处理功能。

  3. 变长数组:C99支持变长数组,可以动态指定数组的长度。而C89中数组的长度必须是常量。

  4. 注释:C99支持在代码中使用//进行单行注释,而C89中只支持/* */多行注释。

  5. 布尔类型:C99引入了_Bool类型,用于表示布尔值(true或false)。而C89中使用整型来表示布尔值。

需要注意的是,不同版本的编译器可能对C89和C99的支持程度有所差异。因此,在选择编译标准时,需要根据实际情况和编译器的支持情况来确定。


物联沃分享整理
物联沃-IOTWORD物联网 » STM32问题解决:declaration may not appear after executable statement in block

发表评论