【问题标题】:Using C Functions in preprocessor statements在预处理器语句中使用 C 函数
【发布时间】:2014-04-06 03:38:05
【问题描述】:

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

例如:

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

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

感谢您的帮助!

【问题讨论】:

  • 这不是关于微控制器编程,而是关于基本C。请查看#define directive in C
  • IMO,这样做的缺点是它使代码的可读性大大降低。

标签: c++ c microcontroller stm32 precompiler


【解决方案1】:

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

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

【讨论】:

  • 谢谢,我想我会用内联函数来做。我唯一不确定的是静态的。如果函数是类方法,那么很明显它们必须是静态的,但如果“fan_off”是一个普通的 C 函数,我想我只需要将它声明为“内联”,而不是“静态内联”?跨度>
  • 这里static与extern相反,与C++类无关,表示函数有内部链接(即只在包含它的c文件中可见) .如果您不声明函数静态,您将拥有与使用具有外部链接(在整个程序中可见)的函数的 c 文件一样多的函数定义,并且您的链接器将抱怨多个定义。
【解决方案2】:

理论上没问题,但你说得对,应该避免使用分号。

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

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

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

【讨论】:

  • 现在宏也不会破坏你最喜欢的迭代器的缩进了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 2010-09-22
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
相关资源
最近更新 更多