我有这个预处理器指令:
#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证实了这一点。问题是,当它应该是16时,分配给iTotalSingleIndexes的值是1.我真的不知道为什么会这样。
当我做类似的事情时:
int iIndexesInASector = INDEXES_PER_SECTOR;
int iTotalSingleIndexes = (iDataBlocks - 29) / iIndexesInASector;
将正确的值分配给iTotalSingleIndexes。
在其他说明中,我在其他方程式中使用预处理程序指令,它们工作正常,所以我更加困惑。
非常感谢任何帮助。
答案 0 :(得分:17)
预处理器只执行令牌替换 - 它不会计算表达式。所以你的行:
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
扩展为完整的子表达式。
答案 1 :(得分:7)
#define INDEXES_PER_SECTOR (BYTES_PER_SECTOR / 4)
答案 2 :(得分:3)
到目前为止,两个给出的答案都是正确的,所以接受其中一个,但我认为我应该扩展他们所说的话
预处理器宏的第1号规则。
如果宏扩展为表达式,请始终将扩展括在括号中
预处理器宏的第2条规则
始终将宏参数括在括号中,在扩展中使用它们
例如,考虑下面的宏
#define X_PLUS_4(X) X + 4
foo = 1;
y = 3 * X_PLUS_4(foo + 2) * 4; // naively expect y to be 84
第二行扩展为
y = 3 * foo + 2 + 4 * 4; // y is 13
这可能不是你想要的
应用规则
#define X_PLUS_4(X) ((X) + 4)
上面的用法变为
y = 3 * ((foo + 2) + 4) * 4;
答案 3 :(得分:2)
如果要使用预处理器完成预处理时操作,可以使用Boost预处理库。但是,你应该真正使用const数据。
const int BytesPerSector = 64;
const int IndexesPerSector = BytesPerSector / 4;
当您绝对没有其他选择时,应保留预处理器。使用const int可以轻松地在编译时执行算术。