【问题标题】:use of define(x) as a function in c [closed]在 c [关闭] 中使用 define(x) 作为函数
【发布时间】:2022-11-24 17:53:25
【问题描述】:
#include <stdio.h>
#define PRODUCT(x) (x * x)
int main (){
    int i=3, j;
    j = PRODUCT(i + 1);
    printf("%d\n",j);
    return 0;
}

任何人都可以向我解释这个程序的行为吗?我无法找出这个的行为?

【问题讨论】:

  • 有谁知道“如何在参数周围用括号编写宏”的一个很好的规范骗局?
  • @Ry-嗯?这是一个相当明确的问题,因为它是 C 初学者 101 的东西。如果我们能找到一个,它应该作为一个骗局被关闭,但目前还不清楚。

标签: c


【解决方案1】:

它只是一个标准的预处理器函数式宏。

简单地用定义代替使用,你得到

j = (i + 1 * i + 1);

这当然是个问题。定义应该是

#define PRODUCT(x)  ((x) * (x))

因为这里的参数可能不止一个标记。

【讨论】:

    【解决方案2】:

    宏只是文本(更准确地说是标记)替换。

    所以PRODUCT(i + 1)在预处理过程中被替换为

    i + 1 * i + 1不是(i + 1) * (i + 1)

    您需要将其定义为

    #define PRODUCT(x) ((x) * (x))
    

    例如,即使有定义宏也不会表现得像函数

    j = PRODUCT(i++);
    

    将调用未定义的行为,因为它将扩展为((i++) * (i++))

    所以基本上尽量避免像函数这样的宏,除非你真的知道你在做什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多