#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
在一个语句中修改了三遍。根据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
一次,并导致不确定的行为。
原因很简单:预处理器执行TEXT SUBSTITUTION并修改在编译器的后续阶段看到的源代码。
与其“试图将函数放入宏中”,不如不使用宏。编写函数。使用功能。或使用宏,但要遵守它们的限制(即,即使它们看起来像函数,它们也不像函数那样起作用)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句