我有这个预处理器指令:
#define INDEXES_PER_SECTOR BYTES_PER_SECTOR / 4
其中 BYTES_PER_SECTOR 在另一个头文件中声明为:
#define BYTES_PER_SECTOR 64
我有一个我写的简单数学方程式,执行后出现断言错误,因为分配给 iTotalSingleIndexes 的值不正确。
int iTotalSingleIndexes = (iDataBlocks - 29) / INDEXES_PER_SECTOR;
现在我认为这是因为预处理器指令 INDEXES_PER_SECTOR。执行我的等式后,iDataBlocks 是 285,这是正确的。我已经用 gdb 确认了这一点。问题是分配给 iTotalSingleIndexes 的值是 1,而它应该是 16。我真的不知道为什么会这样。
当我做类似的事情时:
int iIndexesInASector = INDEXES_PER_SECTOR;
int iTotalSingleIndexes = (iDataBlocks - 29) / iIndexesInASector;
正确的值被分配给 iTotalSingleIndexes。
在其他笔记中,我在其他方程式中使用预处理器指令,它们工作得很好,所以我更加困惑。
如有任何帮助,我们将不胜感激。
最佳答案
预处理器只是执行标记替换——它不计算表达式。所以你的台词:
int iTotalSingleIndexes = (iDataBlocks - 29) / INDEXES_PER_SECTOR;
扩展为这个标记序列:
int iTotalSingleIndexes = ( iDataBlocks - 29 ) / 64 / 4 ;
...由于 /
运算符的关联性,编译器随后将其解析为:
int iTotalSingleIndexes = ((iDataBlocks - 29) / 64) / 4;
...结果为 1。正如 leppie 所说,您想要:
#define INDEXES_PER_SECTOR (BYTES_PER_SECTOR / 4)
这使得 INDEXES_PER_SECTOR
扩展为一个完整的子表达式。
关于c++ - 使用预处理器指令从数学方程式生成错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3456124/