警告的意思是:函数“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);
}