stm32里为什么结构体变量定义GPIO_InitTypeDef GPIO_InitStruct;要放在RCC_APB2PeriphClockCmd()前面?
如果这样写RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDefGPIO_InitStr...
如果这样写
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
就MDK就报错 main.c(6): error: #268: declaration may not appear after executable statement in block
请问为什么报错,这两句话有什么联系? 展开
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
就MDK就报错 main.c(6): error: #268: declaration may not appear after executable statement in block
请问为什么报错,这两句话有什么联系? 展开
7个回答
展开全部
这与STM32无关,是C语言的语法要求,C语言要求,变量定义之前,不得有任何内存的读写操作,比如赋值,函数调用等等,都涉及到内存的操作,这些动作,不得在变量定义之前。
这是因为,定义变量,是要从内存中的堆空间或者栈空间分配空间给这个变量的,所以,出于安全及简单考虑,C语言不允许在变量定义之前有内存的操作.
所以,即使你把“GPIO_InitTypeDef GPIO_InitStruct;”换成int a;也是不行的。
C语言的升级版 C++允许在定义之前进行内存操作
这是因为,定义变量,是要从内存中的堆空间或者栈空间分配空间给这个变量的,所以,出于安全及简单考虑,C语言不允许在变量定义之前有内存的操作.
所以,即使你把“GPIO_InitTypeDef GPIO_InitStruct;”换成int a;也是不行的。
C语言的升级版 C++允许在定义之前进行内存操作
展开全部
这种情况是C语言本身的特性决定的。
GPIO_InitTypeDef是一个结构体类型,GPIO_InitStruct是一个变量名称。
而RCC_APB2PeriphClockCmd()是一个函数调用,是具体的可执行代码。
C语言规定,变量的定义,必须位于函数的前面(用于定义全局变量),或者在函数内部也必须放于可执行语句的前部。不允许出现先有代码再定义变量之后又有代码的混合结构。
所以从这个特点来看,定义变量GPIO_InitStruct的语句必须放在可执行代码 RCC_APB2PeriphClockCmd()的前面。
GPIO_InitTypeDef是一个结构体类型,GPIO_InitStruct是一个变量名称。
而RCC_APB2PeriphClockCmd()是一个函数调用,是具体的可执行代码。
C语言规定,变量的定义,必须位于函数的前面(用于定义全局变量),或者在函数内部也必须放于可执行语句的前部。不允许出现先有代码再定义变量之后又有代码的混合结构。
所以从这个特点来看,定义变量GPIO_InitStruct的语句必须放在可执行代码 RCC_APB2PeriphClockCmd()的前面。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果你RCC_APB2PeriphClockCmd()这个函数没有调用GPIO_InitStruct结构体的话,放哪都没关系,如果调用了,最好放他前面,否则就会提示GPIO_InitStruct没有定义,如果没掉用那就没什么关系了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
编译器限制了定义变量应放在大括号的开始位置.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
先要定义一个结构体,然后用这个新定义的结构体来初始化!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询