学习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]
为什么会出现此警告以及删除警告需要采取哪些措施?
答案 0 :(得分:3)
据我所知,你的语法是错的。 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
。
答案 1 :(得分:1)
从第一个地方看起来(除非在你的情况下ISR
是一个扩展为某种形式的宏),它被称为旧式函数定义其中type {{ 1}}被隐含地应用于int
这样的参数。我建议将其更改为具有explicite类型的原型:
USART0_RX_vect
请注意,自C99起,这种带隐式类型的旧式定义不正确。但是如果你想(为了一些不明原因)保持旧式,那么你去吧:
int ISR(int USART0_RX_vect) {
// blah blah blah...
return 0;
}
这种旧式定义在现代C标准中“幸免于难”,因为它具有现有代码库的可移植性。作为一种好的做法,我建议避免它们,在int ISR(USART0_RX_vect)
int USART0_RX_vect;
{
// blah blah blah...
return 0;
}
编译器中,您可以添加gcc
选项来为它们发出警告。
请注意,C中使用全大写字母的标识符通常被视为宏定义。