编译器预处理期间的数学运算

时间:2012-11-09 23:13:31

标签: c++ gcc c-preprocessor

我经常会遇到需要在编译时生成几个常量才能使用位移和屏蔽操作的情况。

e.g。

#define blockbits 8
#define blocksize 256   // could be generated from 2^blockbits
#define blocksize 0xFF  // could be generated from blocksize - 1

我希望所有这些都是从blockbits生成的,但是没有可以在我知道的预处理器中使用的幂操作。

有没有人知道在编译时生成这种事情的简单方法?

2 个答案:

答案 0 :(得分:8)

您可以将它们定义为数学表达式:

#define blockbits 8
#define blocksize (1 << blockbits) 
#define blockXXXX (blocksize - 1) // changed from blocksize to blockXXXX, since blocksize is already taken

括号是为了确保在其他表达式中使用它们时没有运算符优先级问题。

您还可能希望将名称更改为全部大写,例如BLOCKBITSBLOCKSIZE等,这是一种C ++命名约定,用于区分宏和普通名称。

答案 1 :(得分:0)

如果你想使用const而不是#define,如果你想制作一个通用的幂函数(不仅仅是2的幂),它将在运行时计算值,你也可以尝试使用这样的模板:< / p>

template<int num, int pow> struct temp_pow
{
    static const unsigned int result=temp_pow<num, pow-1>::result*num;
};

template<int num> struct temp_pow<num, 1>
{
    static const unsigned int result=num;
};

const int BLOCKBITS = 8;
const int BLOCKSIZE = temp_pow<2,BLOCKBITS>::result;   // could be generated from 2^BLOCKBITS
const int BLOCKSIZE_1 = BLOCKSIZE-1;