学习 AVR C 编程我最终收到来自
的警告int ISR(USART0_RX_vect) {
// blah blah blah...
return 0;
}
//Warning 1 type of 'USART0_RX_vect' defaults to 'int' [enabled by default]
为什么会出现此警告以及需要采取什么措施来删除它?
据我所知,你的语法是错误的。
ISR
是一个简化中断处理程序定义的宏。 ISR
解析为 __attribute__
修饰函数,其签名已指定返回类型 void
。
USART0_RX_vect
将解析为类似 __vector_18
(ATMEGA128)。
像这样的东西将是定义替换的结果:
void __vector_18 (void) __attribute__ ((signal,__INTR_ATTRS));
void __vector_18 (void) {
// your code would appear here
}
因此只需省略返回类型,因为它是并且必须是
void
。
从它最初的样子来看(除非在你的情况下
ISR
是一个扩展为某种形式的宏),它被称为旧式函数定义,其中类型int
隐式应用于诸如之类的参数USART0_RX_vect
。我建议将其更改为具有明确类型的原型:
int ISR(int USART0_RX_vect) {
// blah blah blah...
return 0;
}
请注意,自 C99 以来,这种带有隐式类型的旧式定义是不正确的。但是,如果您想(出于某种不明原因)保持旧式,那么您就可以:
int ISR(USART0_RX_vect)
int USART0_RX_vect;
{
// blah blah blah...
return 0;
}
由于现有代码库的可移植性,这种旧式定义在现代 C 标准中“幸存”。作为一个好的做法,我建议避免它们,在
gcc
编译器中,您可以添加 -Wold-style-definition
选项来向它们发出警告。
请注意,C 中全大写字母的标识符通常被识别为宏定义。
我知道这已经很旧了,但发生这种情况的原因是因为您在文件顶部缺少
#include <avr/interrupt.h>
。如果没有这个来定义 ISR 是什么,编译器只会认为它是一个常规函数,该函数正在传递一个名为 USART0_RX_vect
的参数,该参数缺少类型,并且也缺少返回类型。因此它假设两者都是 int
,因此出现警告。