定义指数预处理器宏

时间:2012-06-08 17:38:08

标签: c++ macros

我计划在几个月内参加一个编程竞赛,我想定义一些宏来减少我需要做的输入。我被告知,将一个数字提升到一个权力是很常见的,从中受益。我只需要它来处理整数参数(尽管参数本身可能是表达式)。我尝试了一些不同的变体,但我无法得到正确的语法。

/* c is where the result is stored */
#define EXP(a,b,c) c=a; for (int ii=0; ii<(b)-1; c*=(a), ii++);

这样可行,但我不能在像function( EXP(a,b,c) );这样的表达式中使用EXP(a,b,c)我必须这样做

int result; 
EXP(a,b,result); 
function(result);

这个,我认为可以在表达式中工作但是无法编译

#define EXP(a,b) int c=a; for (int ii=0; ii<(b)-1; (c)*=(a), i++); c

使用:error: expected primary-expression before ‘int’用于:

int result = EXP(2,10);

这是我的代表职能:

int EXP(int base, int power) {
  int result = base;
  for (int ii=0; ii<power-1; ii++)
    result *= base;
  return result;
}

2 个答案:

答案 0 :(得分:3)

使用宏功能是错误的工具。不过,你说你认为它可以在表达式中工作,考虑一旦预处理器完成他的工作,它将如何看待实际的编译器:

int result = int c=2; for (int ii=0; ii<(10)-1; (c)*=(2), i++); c

无论你怎么努力,你都不能在表达式中做变量定义和for循环。

答案 1 :(得分:3)

您可以使用递归模板模板方法:

template<int base, unsigned int exp>
struct Pow {
    enum { value = base * power<base, exp-1>::value };
};
// stopping condition
template<int base>
struct Pow<base,0> {
    enum { value = 1 };
};

并像这样使用它:

int i = Pow<10,2>::value;