如何将函数放在宏中?

Pepperguy3
#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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将函数放在React className字段中?

来自分类Dev

如何将JsBarcode放在javascript按钮函数中?

来自分类Dev

如何将函数的返回值放在QLineEdit中?

来自分类Dev

如何将printf()包装到函数或宏中?

来自分类Dev

如何将ComboBoxTableCell放在TableView中?

来自分类Dev

如何将jpg放在JComboBox中?

来自分类Dev

如何将重点放在榆木中?

来自分类Dev

如何将ID放在fnSelect()中?

来自分类Dev

如何将QComboBox放在QColumnView中

来自分类Dev

如何将jpg放在JComboBox中?

来自分类Dev

如何将 php 放在 php 中

来自分类Dev

如何将“AdaptiveActionSet”放在“AdaptiveColumn”中?

来自分类Dev

在C ++中使用重载时,如何将重载函数放在lhs中?

来自分类Dev

如何将两个函数调用放在一个 HTML 文件中?

来自分类Dev

如何将字符串传递给宏函数

来自分类Dev

如何将函数条件的符号传递给宏

来自分类Dev

在函数内部获取请求。如何将它放在 ComponentDidMount 中?

来自分类Dev

如何将viewpager放在android中的片段中?

来自分类Dev

如何将if语句放在Hacklang中的并发块中?

来自分类Dev

如何将 LineaLayout 中的 RadioButton 放在 RadioGroup 中

来自分类Dev

如何将像 (find, findOneAndUpdate) 这样的猫鼬查询放在与我的路由不同的文件上的函数中?

来自分类Dev

如何将css放在角度js的选定行中?

来自分类Dev

您如何将li放在不同的div中?

来自分类Dev

如何将SQL查询放在Yii的数组中

来自分类Dev

如何将angularjs属性放在Rails erb中

来自分类Dev

如何将整数位放在浮点数中?

来自分类Dev

如何将“子类”放在一个类中

来自分类Dev

如何将类放在Html.Dropdownlist中?

来自分类Dev

如何将文本放在ggplot中的不同行上

Related 相关文章

热门标签

归档