使用预处理程序指令从数学方程生成的值错误

时间:2010-08-11 07:16:01

标签: 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证实了这一点。问题是,当它应该是16时,分配给iTotalSingleIndexes的值是1.我真的不知道为什么会这样。

当我做类似的事情时:

int iIndexesInASector = INDEXES_PER_SECTOR;
int iTotalSingleIndexes = (iDataBlocks - 29) / iIndexesInASector;

将正确的值分配给iTotalSingleIndexes。

在其他说明中,我在其他方程式中使用预处理程序指令,它们工作正常,所以我更加困惑。

非常感谢任何帮助。

4 个答案:

答案 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可以轻松地在编译时执行算术。