1

我正在一个 stm32f4 芯片上编写一个 c++ 应用程序,该芯片有几个 IO 来控制。我的一位同事建议对所有这些 IO 进行预处理语句,以使代码更具可读性。

例如:

#define FAN_ON     GPIO_SetBits(GPIOD, GPIO_Pin_0);
#define FAN_OFF    GPIO_ResetBits(GPIOD, GPIO_Pin_0);

这样可以吗,如果不行,为什么?我还没有太多的微控制器经验,但我读到分号不应该在预处理器语句中使用,而且我也不确定在预编译器语句中使用函数是否是一种好的风格?

谢谢您的帮助!

4

2 回答 2

5

理论上这很好,但你是对的,应该避免使用分号。

最好将代码包装在一个虚拟循环中:

#define FAN_ON    do { GPIO_SetBits(GPIOD, GPIO_Pin_0); } while(false)

这使宏的行为类似于单个语句。

于 2014-03-04T14:32:38.477 回答
1

要回答您的第一个问题,尽管这很常见,但使用预处理器语句来定义函数是一种非常糟糕的风格,除非您真的需要预处理器。当你需要类似的东西时,你真的需要预处理器__LINE__,或者预处理器替换技巧,比如将函数名放在char *变量中。您可以定义一个函数void fan_on(void)void fan_off(void)而不是那些宏,static inline如果您想像使用宏一样在头文件中声明它们,您甚至可以声明它们。调试器可以比宏更好地使用函数,并且可以更好地调试。

正如您所说,如果您仍想使用宏,则不应使用分号,并使用do while(0)结构,如果您不使用宏,则单行if块只会执行宏的第一行。

于 2014-03-04T21:26:13.657 回答