【问题标题】:How to properly define and use parameters in C macro functions?如何在 C 宏函数中正确定义和使用参数?
【发布时间】:2020-10-07 17:00:27
【问题描述】:

我想使用 C 中的基本宏来访问 char-Array (*char) Arr 中的某个位 b:

#define TstBit (Arr,b) ( Arr[b/8] & (1 << (b%8)) )  

但是在这样的使用情况下:

int foo(const char *charArray) {  
  int readindex = 0;  
  [...]  
    if(TstBit(charArray,readIndex++)) {  

我在#define-Statement 行中遇到错误:

main.c | line 7 | error: 'Arr' undeclared (first use in this function)  

我怀疑我在调用函数时传递的参数很糟糕,或者#define 需要更多的括号。

【问题讨论】:

  • 这个宏的另一个问题是,在你修复了空格之后,TstBit(charArray, readIndex++) 将增加readIndex 两次,而且它具有未定义的行为,因为在两者之间没有sequence point二。这是您应该强烈考虑改用函数的众多原因之一(可能使用inline)。
  • @NateEldredge 绝对可以。根本不值得麻烦。

标签: c function parameters macros c-preprocessor


【解决方案1】:

TstBit 后面的空格似乎是这里的问题。与 C 编译器不同,预处理器对空格比较挑剔。

使用您的宏,预处理器所做的是将所有出现的TstBit 替换为(Arr,b),这不是您的意图。

#define TstBit(Arr,b) ( Arr[b/8] & (1 << (b%8)) )

应该按照你想要的方式工作。

编辑: 另请注意,您尝试使用此宏的方式存在问题,如 this comment! 中所述!

理想情况下,宏参数不应有副作用。如果是这样,您应该注意它们不会导致未定义或意外的行为。

【讨论】:

  • 确实如此简单。谢谢!
  • 实际上并没有那么简单,请参阅 Nate 的 comment 宏导致未定义的行为。
  • @WeatherVane 谢谢!我也会在我的答案中链接该评论。
猜你喜欢
  • 1970-01-01
  • 2016-01-08
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 2014-02-26
  • 2012-09-07
相关资源
最近更新 更多