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

标签 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

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

有人知道在编译时生成这种东西的简单方法吗?

最佳答案

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

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

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

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

关于c++ - 编译器预处理期间的数学运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13317401/

相关文章:

来自文件的 C++ 数组输入

python - 无法构建使用 Python 的项目

c++ - 字符串*还是字符*?

c++ - 如何用#include 替换这个预处理器宏?

c++ - 我需要#undef 本地#define 吗?有本地定义这样的东西吗?

c++ - 内存中静态方法和非静态函数的区别

gcc - 为什么链接库的顺序有时会导致 GCC 出错?

c - 执行 Ansi C 标准检查的 GCC 选项?

在Windows上使用gcc 5.3.0编译Lua 5.2.4模块

宏可以从其参数中删除字符吗?