警告的意思是:函数“xxx”的隐式声明在C99中无效,重点是“声明”。
C语言规范中,函数定义要出现在函数调用之前,否则就会报错!如果调用前没有定义,就要在调用前做一下声明,函数的定义就可以放到被调用的后边。总之:
1.先定义函数—–再调用函数
2.先声明函数—–再调用函数——-最后定义函数
如果只声明函数而没有定义函数(函数的具体实现部分),那么就会直接报错:
Error: L6218E: Undefined symbol function“XXX” (referred from main.o)!
如果没有声明,但是已经定义了函数,只是会出现警告:
Warning: #223-D: function “XXX” declared implicitly!
关于警告Warning:Implicit declaration of function “xxx” is invalid in C99!,说明函数已经定义,是函数的声明存在问题,检查以下几点:
1.函数的声明放在头文件(H文件);
2.函数定义在源文件(C文件);
3.函数的名称是否一致(大小写要一致);
4.声明被调用函数的头文件已经被包含(#include);
5.函数声明的先后顺序(被调用的函数声明放在执行调用函数的声明前面)
6.如果以上检查都没有问题,查看H头文件的头部,如下代码:
错误写法: #ifndef _TIMER_H #define _TIMER_H 正确写法1://区别就是最后加一个下划线“_” #ifndef _TIMER_H_ #define _TIMER_H_ 正确写法2://区别就是最前面多一个下划线“_” #ifndef __TIMER_H #define __TIMER_H
函数声明:(函数声明给出了函数原型,让编译器知道函数的存在,以及存在的形式。)
.H文件void TIM3_Int_Init(unsigned int arr,unsigned int psc);void TIM2_Int_Init(unsigned int time);void EC20TimersDisable( void );void EC20TimersEnable( void );
函数定义:(函数体本身)`
.C文件void TIM2_Int_Init(unsigned int time){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);//TIM_DeInit(TIM2);TIM_TimeBaseStructure.TIM_Period = time * 5; /* 自动重装载寄存器周期的值(计数值) *//* 累计 TIM_Period个频率后产生一个更新或者中断 */TIM_TimeBaseStructure.TIM_Prescaler= (16800-1); /* 时钟预分频数 */TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; /* 采样分频 */TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; /* 向上计数模式 */TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);TIM_ClearFlag(TIM2, TIM_FLAG_Update); /* 清除溢出中断标志 *///TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//TIM_Cmd(TIM2, ENABLE);/* 开启时钟 *//* Enable CANx RX0 interrupt IRQ channel */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}