编译器预处理过程中的数学操作
Mathematical operations during compiler preprocessing
我经常会有我需要在编译时间生成的几个常数以使用位移动和掩盖操作。
,例如
#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
括号是为了确保在其他表达式中使用时没有操作员优先问题。
您可能还想将名称更改为所有大写,例如BLOCKBITS
,BLOCKSIZE
等,这是C 命名约定,以区分宏与正常名称。
如果要使用const而不是#define's,并且如果要制作一个通用的功率函数(不仅仅是2个幂),该功能会在运行时计算值,您也可以尝试使用这样的模板进行操作:
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;
相关文章:
- 错误:无效的预处理指令 #i 的意思是 #if?
- 像union_这样的 Boost.Geometry 操作如何处理浮点类型的基本不精确性?
- C++预处理会生成变量成员、资源库和映射
- 使用预处理指令检查是否包含标头?
- 预处理的 C/C++ 文件是否特定于计算机?
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 在 CPLEX 中求解线性规划,无需剪切和预处理
- CPP -D 选项,用于预处理 Fortran 代码
- 错误:粘贴"tmp_UINT"和"+"未提供有效的预处理令牌
- 任务计划程序库的预处理不起作用 - 多定义错误
- Eclipse 问题 - 编译期间不考虑 .c 和 .cpp 文件中定义的预处理
- 使用python预处理后,C++(opencv)中的垫子类型数据与image_to_array相同
- Howo 使用 cl 预处理为 masm 组装生成一个单独的文件
- 我有一个预处理的 C/C++ 源文件 (cacti.i).如何从这个 .i 文件生成可执行二进制文件,以便我可以像 ./
- 如何使用Visual Studio C/C++编译器(cl.exe)来预处理我的objective-C代码
- 是具有预处理前分支实现的结构违反ODR
- 与不完整的Cholesky预处理的共轭梯度返回特征库的意外错误
- Visual Studio C - 无法输出预处理文件
- 在海湾合作委员会中加快宏观预处理的任何方法
- 编译器预处理过程中的数学操作