' USART0_RX_vect'的类型默认为' int' [默认启用]

时间:2014-07-10 10:04:26

标签: c warnings compiler-warnings avr

学习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]

为什么会出现此警告以及删除警告需要采取哪些措施?

2 个答案:

答案 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中使用全大写字母的标识符通常被视为宏定义。