【发布时间】:2016-06-14 13:58:47
【问题描述】:
我正在尝试在 XMEGA 微控制器中设置 USART 模块,但偶然发现了一个我找不到的错误。为了清楚起见,我给你完整的代码。所以这个头文件中没有任何东西丢失。 (F_CPU在主文件中定义)
#ifndef USART_H_
#define USART_H_
#include <avr/io.h>
#define USART_BAUDRATE 4800
#define USART_BSCALE -3
#if USART_BSCALE < 0
#define USART_BSEL F_CPU / (pow(2,USART_BSCALE) * 16 * USART_BAUDRATE) - 1
#define USART_BAUD_REAL F_CPU / (pow(2,USART_BSCALE) * 16 * (USART_BSEL + 1))
#else
#define USART_BSEL (1 / (pow(2,USART_BSCALE))) * (F_CPU / (16 * USART_BAUDRATE) - 1)
#define USART_BAUD_REAL F_CPU / (16 * ((pow(2,USART_BSCALE) * USART_BSEL) + 1))
#endif
#define USART_BAUD_ERROR USART_BAUD_REAL * 1000 / USART_BAUDRATE
#if USART_BAUD_ERROR<990 || USART_BAUD_ERROR>1010 /* <-- ERROR IS IN THIS LINE! */
#error Baud rate error too high!
#endif
#endif /* USART_H_ */
编译器以错误结束
在标记“(”之前缺少二元运算符
在标记的行中。以前有括号,但我删除了它们,尝试了不同的括号组合,但编译器仍然在那里看到它们。这里有什么问题?
【问题讨论】:
-
您不能在#if 预处理器指令参数中使用 C 函数 (pow...),因为它是在编译时由预处理器评估的...
-
哦,那很糟糕。那么还有其他方法可以计算幂吗?
-
并且您应该重新考虑您的计算以获得仅整数的中间结果(是的,这是可能的)。它不会像现在这样工作。
-
除此之外:将
(brackets)放在所有宏操作数周围。否则以-1结尾的那个可能会在后面的宏中被错误地使用。这不是 C 优先规则:它是文本替换。
标签: c c-preprocessor avr-gcc