当前位置:  开发笔记 > 小程序 > 正文

C语言中类似函数的宏定义

如何解决《C语言中类似函数的宏定义》经验,为你挑选了2个好方法。

我想定义一个像MACRO这样的函数.即

#define foo(x)\
#if x>32\
 x\
#else\
 (2*x)\
#endif

那是,

if x>32, then foo(x) present x
else, foo(x) present (2*x)

但我的海湾合作委员会抱怨:

int a = foo(31);

我认为C预处理器应该正确处理.因为在编译时,它知道x=33.它可以代替foo(33)(2*33)



1> Johannes Sch..:

你可以如下

#define foo(x) ((x) > 32 ? (x) : (2 * (x)))

但是这次评估x多次.您可以改为创建一个更干净的静态函数

static int foo(int x) {
  if(x > 32) 
    return x;
  return 2 * x;
}

然后你也可以传递foo有副作用的东西,副作用只发生一次.

什么你写使用的#if,#else#endif预处理指令,但你需要,如果你传递变量的宏观和要评估他们的价值使用的语言结构.在实际语言结构中使用ifelse语句也不起作用,因为控制流语句不会计算为值.换句话说,if语句只是转向控制流("如果A,则执行B,否则执行C"),而不是评估任何值.


@richard:使函数内联 - 如果在编译时知道该值,编译器通常会在编译时执行求值.即使对于未标记为"内联"的静态函数,编译器也可以这样做.您甚至可以通过更现代的编译器/链接器工具获得"extern"函数优化的好处(但可能性会降低).使用VS2008进行的快速测试表明,即使在单独的源文件中定义了`extern`,它也没有问题内联litb的`foo()`函数.传递文字整数时,结果在编译时计算.
@richard :(继续) - 使用今天的工具,几乎不需要担心你的问题涉及的"优化"类型.通常,您不需要使用这些类型的宏/预处理器技巧来跳过"运行时节省时间".首先以正确,可维护和使用有效算法的方式编写代码(注意:这与尝试计算周期不同).当事实证明最初的尝试不够快时,只担心跳过篮球.

2> Vanni Totaro..:
#define \
    foo(x) \
    ({ \
        int xx = (x); \
        int result = (xx > 32) ? xx : (2*xx); \
        result; \
    })


@Vanni:我忘记了GCC有一个名为'Statement Expressions'的扩展名.由于提出问题的人用"gcc"标记了它,这对他来说可能没问题.但是,我认为一个简单的内联函数也可以工作,并且更加便携.
@Michael:感谢您指出这是gcc扩展!我不知道它的名字,而且它不便于携带!:)
推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有