【问题标题】:C preprocessor macro for pointer to structure member用于指向结构成员的指针的 C 预处理器宏
【发布时间】:2012-10-17 13:33:33
【问题描述】:

我想制作一个 C 宏来替换 if 语句。

我一直无法很好地掌握 C 宏,我需要做令牌吗 粘贴?

#define BROWSER_HTML_HOW_OPENTAG 0x19939292
structure  { dword how;  } _tag;
structure  { _tag cur_tag;  } _ibot;

// works fine
foo()
{
    _ibot*ibot;
    if(ibot->cur_tag->how==BROWSER_HTML_HOW_OPENTAG) { } // do something
}

但我想实现这个

#define browserTagCheck(tag,how)    (tag->how==how)
foo()
{
    _ibot*ibot;
    if(browserTagCheck(ibot->cur_tag,BROWSER_HTML_HOW_OPENTAG) {} // do something
}

我收到一个错误:

错误:数字常量之前的预期标识符|

【问题讨论】:

  • 您在if() 中遗漏了)。另外,它是struct 而不是structure
  • 这不是主要问题,但您的if 中缺少括号。
  • 我们必须假设这是伪代码,因为它不是有效的 C 代码。

标签: c pointers macros c-preprocessor


【解决方案1】:

我认为您在两种意义上使用名称how:作为cur_tag 的成员,以及作为browserTagCheck 宏的参数。尝试为宏参数使用不同的名称。

【讨论】:

  • 好的,这是有道理的.. 有没有办法使宏使用相同的名称合法.. ?在它周围使用某种括号?
  • 我不知道,但即使有,对我来说听起来也不是很清楚......使用类似的名称怎么样,例如_how
【解决方案2】:

不要那样做。永远不要尝试重新发明 C 语言,这是非常糟糕的做法。

相反,我强烈建议这样做:

inline bool browserTagCheck (const struct something_t* x)
{
  return x->tag == BROWSER_HTML_HOW_OPENTAG;
}


...

if(browserTagCheck(&ibot))
{
  doStuff();
}

很可能甚至不需要内联,因为这似乎是某种没有实时要求的 web/html 应用程序。

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多