【问题标题】:How to use the following preprocessor statement如何使用以下预处理器语句
【发布时间】:2015-05-14 13:18:45
【问题描述】:
#define IS_THIS_CORRECT(X) if(X){}

我在我的项目中定义了这个预处理器语句。我正在尝试了解如何使用此功能。

【问题讨论】:

  • 这不是函数

标签: c macros c-preprocessor


【解决方案1】:
#define IS_THIS_CORRECT(X) if(X){}

它可用于检查X(任何值)是否不为零或不是空字符串等。您可以执行以下操作

IS_THIS_CORRECT("Hello")
else puts("The string is empty");

您最好用另一副牙套围绕X 以更安全:

#define IS_THIS_CORRECT(X) if((X)){}

我建议您将此预处理器语句重命名为 IT_IS_CORRECT 甚至 IS_CORRECT 以提高可读性。

【讨论】:

  • 额外的一对括号似乎是个坏主意。 X 已经用括号括起来,因此添加它不是必需的,但会抑制使用常见编译器的IS_THIS_CORRECT(foo = bar) 的有用编译器警告。
  • @Wintermute,我只是在关注 K&R 的解决方案。据我记得,他们总是说必须将这些额外的大括号添加到预处理器语句中,例如#define add(x,y) (x)+(y)。尝试移除大括号并执行add(5+7,10+2)
  • 这基本上是正确的,但在if(X) 中已经有一对括号在做这些括号的工作:确保X 被视为一个实体。 (顺便说一下,不好的例子;使用mul 宏会更好)。
  • @Wintermute,是的,不是很好,但我想你明白了。
【解决方案2】:

我猜,但这对我来说有意义的唯一方法是它是否应该被用作

IS_THIS_CORRECT(foo) else { do_something(); }

不过还是很奇怪。

【讨论】:

  • 非常感谢您的 cmets。
【解决方案3】:

正如目前所写的那样,几乎没有可能有意义使用它,除非您只想根据X 的值处理 FALSE 情况。

恕我直言,你可以改写成

#define IS_THIS_CORRECT(X) if(X)

然后,你可以像这样使用它

 int p = 5;
 IS_THIS_CORRECT(X)
 {
      printf("yay !!!\n");
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 2010-09-22
    • 2013-03-30
    • 1970-01-01
    相关资源
    最近更新 更多