在c中使用define(x)作为函数[duplicate]

3j86kqsm  于 2022-12-03  发布在  其他
关注(0)|答案(2)|浏览(111)

此问题在此处已有答案

C macros and use of arguments in parentheses(2个答案)
The need for parentheses in macros in C [duplicate](8个答案)
8天前关闭.

#include <stdio.h>
#define PRODUCT(x) (x * x)
int main (){
    int i=3, j;
    j = PRODUCT(i + 1);
    printf("%d\n",j);
    return 0;
}

有人能解释一下为什么输出是7而不是我预期的16吗?

ulydmbyx

ulydmbyx1#

它只是一个标准的预处理器函数-类似宏。
只要用定义替换用法,就可以得到

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

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

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

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

6qqygrtg

6qqygrtg2#

宏只是文本(更准确地说是标记)替换。
因此,在预处理期间替换PRODUCT(i + 1),以
而不是从i + 1 * i + 1(i + 1) * (i + 1)
您需要将其定义为

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

即使有定义,宏也不会像函数那样运行,例如

j = PRODUCT(i++);

将调用未定义的行为,因为它将扩展为((i++) * (i++))
所以基本上尽量避免像函数这样的宏,除非你真的知道你在做什么。

相关问题