c++ - 使用预处理器指令从数学方程式生成错误值

标签 c++ c

我有这个预处理器指令:

#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/

相关文章:

c++ - 我可以在 Visual C++ 中使用 graph.h、dos.h 和 bios.h 吗?

c++ - 访问多个数组时 cpu 缓存做什么?

c++ - 声明默认模板函数

c++ - 类型 "void *"的值不能分配给类型 "RANDOMSTRUCT *"的实体

c - 程序,它将找出其他程序的性能/属性。

c - Spidev 不使用 ioctl 同时写/读

c++ - 如何在字符串中查找格式化数字?

c++ - 为什么 case 语句中的标签应该是常量?

python - Dbus & Bluez 编程语言

C 字符数组无法正常工作