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