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

cam*_*ccc 5 c++ gcc c-preprocessor

我经常遇到这样的情况:我需要在编译时生成几个常量,以便使用位移和屏蔽操作.

例如

#define blockbits 8
#define blocksize 256   // could be generated from 2^blockbits
#define blocksize 0xFF  // could be generated from blocksize - 1
Run Code Online (Sandbox Code Playgroud)

我想要生成所有这些blockbits,但是没有可以在我知道的预处理器中使用的电源操作.

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

Set*_*gie 8

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

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

括号用于确保在其他表达式中使用它们时不存在运算符优先级问题.

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

  • +1,预处理器将按原样替换它们,编译器将计算这些值. (2认同)