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

问题描述 投票:0回答:3

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

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

c warnings compiler-warnings avr
3个回答
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
投票

从它最初的样子来看(除非在你的情况下

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


0
投票

我知道这已经很旧了,但发生这种情况的原因是因为您在文件顶部缺少

#include <avr/interrupt.h>
。如果没有这个来定义 ISR 是什么,编译器只会认为它是一个常规函数,该函数正在传递一个名为
USART0_RX_vect
的参数,该参数缺少类型,并且也缺少返回类型。因此它假设两者都是
int
,因此出现警告。

© www.soinside.com 2019 - 2024. All rights reserved.