先说一个CSDN 的BUG,我第一次用CSDN,输入本文章的标题时,在复制main.c(15): error: #130: expected a "{"之后,标题就无法显示了,经过多次尝试,发现标题识别在第一个英文输入下的右括号,即“)”结束,故必须把main.c(15): error: #130: expected a "{"中c(15)中的括号改为中文输入下的括号。
网上查了一下,标题所述的问题有很多种情况,我目前遇到了一种很奇葩但很有意义的错误原因,记录在此供大家交流学习,其他类型的错误我有空会进行整理
问题描述
情况1
为简单起见,我举一个非常简单的例子,主文件main.c内代码1如下:
#include "stm32f10x_gpio.h"
int main (void)
{
int i;
i=1;
}
就是简单的定义一个整形变量i,并给i赋值为1,可以看出主函数内的内容是完全没问题的,分号";"也是英文输入法下的格式。
但是编译后还是报错main.c(15): error: #130: expected a “{”,让人摸不到头脑。
解决方案
情况1方案
其实代码很简单,就这么短,在反复确认主函数内部没有问题后,就应该考虑主函数之外的内容了,实际上主函数之外就只剩下C语言的预编译命令:
#include "stm32f10x_gpio.h"
该命令将头文件包含进main.c文件,在编译中,实际上编译器就会将stm32f10x_gpio.h中的文件复制到main.c中,代替预编译命令的位置。而我的stm32f10x_gpio.h中内容为:
void GPIO_SetBits(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin);
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
包含了两个函数头,而细心点就会发现上述代码第二行少了一个分号“;”
就是这个错误,在编译时,编译器把stm32f10x_gpio.h中的文件复制到main.c中,代替预编译命令的位置后,就发现主函数前一行少了一个分号,故而报错,至于为什么报错少一个“}”而不是报错漏了一个“;”,我就不得而知了。
总结
1.在主函数附近的错误,需要考虑函数外经跟着的内容,包括函数前和函数后;