gpt4 book ai didi

c - 如何将函数放入宏中?

转载 作者:行者123 更新时间:2023-12-02 04:01:14 27 4
gpt4 key购买 nike

#include <stdio.h>
// 2.1
#define subm(a,b) (a - b)
#define cubem(a) (a * a * a)
#define minm minf
#define oddm oddf
//---------------------------Given Code------------------------------------
int subf(int a, int b) {
return a - b;
}
int cubef(int a) {
return a * a * a;
}
int minf(int a, int b) {
if (a <= b) {
return a;
} else {
return b;
}
}
int oddf(int a) {
if (a % 2 == 0) {
return 0;
} else {
return 1;
}
}
//----------------------------Given Code----------------------------------
// 2.2
int main() {
int a = 5;
int b = 7;

subf(a,b);printf("subf = %d\n", subf(a,b));
subm(a,b);printf("subm = %d\n", subm(a,b));
subf(a++,b--);printf("subf = %d\n", subf(a++,b--));
subm(a++,b--);printf("subm = %d\n", subm(a++,b--));

cubef(a);printf("cubef = %d\n", cubef(a));
cubem(a);printf("cubem = %d\n", cubem(a));
cubef(--a);printf("cubef = %d\n", cubef(--a));
cubem(--a);printf("cubem = %d\n", cubem(--a));

minf(a,b);printf("minf = %d\n", minf(a,b));
minm(a,b);printf("minm = %d\n", minm(a,b));
minf(--a,--b);printf("minf = %d\n", minf(--a,--b));
minm(--a,--b);printf("minm = %d\n", minm(--a,--b));

oddf(a);printf("oddf = %d\n", oddf(a));
oddm(a);printf("oddm = %d\n", oddm(a));
oddf(a++);printf("oddf = %d\n", oddf(a++));
oddm(a++);printf("oddm = %d\n", oddm(a++));
}

我在将函数放入宏中时遇到一些问题。我的教授希望我们了解宏和函数是如何处理的。我这样做的方式基本上就像你在这里看到的那样,但它工作不正常,或者至少

#define cubem(a) (a * a * a)

正在生成错误,但我不知道为什么。有人可以帮忙吗?

编辑:错误如图所示

hw02q2.c:42:31: warning: multiple unsequenced modifications to 'a'
[-Wunsequenced]
printf("cubem = %d\n", cubem(--a));
^~
hw02q2.c:4:19: note: expanded from macro 'cubem'
#define cubem(a) (a * a * a)

最佳答案

原因是

#define cubem(a) (a * a * a)

/* and later using it .... */

printf("cubem = %d\n", cubem(--a));

进行文本替换,并生成

printf("cubem = %d\n", (--a * --a * --a));

它在一条语句中修改a 3次。根据 C 标准,这是未定义的行为。

相比之下,

int cubef(int a) {
return a * a * a;
}

/* and later */

printf("cubef = %d\n", cubef(--a));

计算--a一次,将结果值传递给cubef()

如果您确实想“将函数放入宏中”,请执行类似的操作

#define cubem(a) cubef(a)

导致该语句的原因

printf("cubem = %d\n", cubem(--a));

成为

printf("cubem = %d\n", cubef(--a));

这样做的问题是它不适用于多次使用其参数的宏。例如

int sq(int a) {return a * a;}

#define cubesq(a) (a * sq(a)) /* uses a more than once

原因

printf("cubesq = %d\n", cubesq(--a));

被编译器视为

printf("cubem = %d\n", (--a * cubesq(--a));

再次修改a一次并导致未定义的行为。

原因很简单:预处理器执行文本替换并修改编译器后续阶段看到的源代码。

不要“尝试将函数放入宏中”,而是不要使用宏。编写函数。使用函数。或者使用宏,但要尊重它们的局限性(即它们不像函数那样工作,即使它们看起来像函数)。

关于c - 如何将函数放入宏中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41919637/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com