【问题标题】:Simple #define:d macro doesn't work in C [closed]简单的#define:d 宏在 C 中不起作用 [关闭]
【发布时间】:2015-03-14 11:42:54
【问题描述】:

我正在上 C 编程入门课程,我们刚刚开始定义宏。如果 cond 为假,我应该定义打印 msg (字符串)的宏 CHECK,但是,它不会打印msgstdout 流,无论 cond 是真还是假。有什么想法吗?

1     #define CHECK(cond, msg) if(!cond) fprintf(stdout, "%s", msg)

【问题讨论】:

  • 请给我们你调用这个宏的代码。
  • 我敢打赌你会传递类似CHECK(a == b, "a is not b"); 的东西,对吧?在这种情况下,它将扩展到if (!a == b),然后运算符优先级会毁了你的一天……这就是为什么你总是无条件地用括号所有的宏参数。
  • 可能在括号里加上 cond #define CHECK(cond, msg) if(!(cond)) fprintf(stdout, "%s", msg)
  • 您的宏定义不起作用,因为该行以1 开头。请参阅sscce.org,了解如何提出“我的程序无法运行”的问题。
  • 另外,不要编写以意想不到的方式改变控制流的宏。您的宏在多个方面存在缺陷。

标签: c macros c-preprocessor


【解决方案1】:

你应该像这样包装你的函数式宏:

#define CHECK(cond, msg)                   \
    do {                                   \
        if (!(cond)) {                     \
             fprintf(stdout, "%s", msg);   \
        }                                  \
    } while (0)

说明: C multi-line macro: do/while(0) vs scope block

【讨论】:

  • 几乎完美。只需将任何出现的condmsg 括在括号中:(cond) ... (msg)
  • 你是对的,谢谢!我相应地改变了我的答案。
【解决方案2】:

尝试将其包装在 {} 中:

 #define CHECK(cond, msg) {if(!cond) fprintf(stdout, "%s", msg)}

另外,确保你真的不是以'1'开头

【讨论】:

  • 这将导致令人惊讶的行为:if (x) CHECK(cond, msg); else func(); 将不起作用,因为额外的分号。你必须使用do { ... } while (0)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 2014-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多