C++ 使用预处理器指令从数学方程生成的值错误
我有这个预处理器指令:C++ 使用预处理器指令从数学方程生成的值错误,c++,c,C++,C,我有这个预处理器指令: #define INDEXES_PER_SECTOR BYTES_PER_SECTOR / 4 其中,每个扇区的字节数在另一个头文件中声明为: #define BYTES_PER_SECTOR 64 我写了一个简单的数学公式,执行后我得到一个断言错误,因为分配给iTotalSingleIndexes的值不正确 int iTotalSingleIndexes = (iDataBlocks - 29) / INDEXES_PER_SECTOR; 现在我相信这是因为
#define INDEXES_PER_SECTOR BYTES_PER_SECTOR / 4
其中,每个扇区的字节数在另一个头文件中声明为:
#define BYTES_PER_SECTOR 64
我写了一个简单的数学公式,执行后我得到一个断言错误,因为分配给iTotalSingleIndexes的值不正确
int iTotalSingleIndexes = (iDataBlocks - 29) / INDEXES_PER_SECTOR;
现在我相信这是因为预处理器指令索引了每个扇区。在执行我的方程式时,iDataBlocks是285,这是正确的。我已经与gdb确认了这一点。问题是分配给iTotalSingleIndexes的值应该是16,而分配给iTotalSingleIndexes的值应该是1。我真的不知道为什么会这样
当我做以下事情时:
int iIndexesInASector = INDEXES_PER_SECTOR;
int iTotalSingleIndexes = (iDataBlocks - 29) / iIndexesInASector;
将正确的值分配给iTotalSingleIndexes
在其他注释中,我在其他等式中使用了预处理器指令,它们工作得很好,所以我更加困惑
任何帮助都将不胜感激。预处理器只是执行标记替换-它不计算表达式。所以你的台词是:
#define INDEXES_PER_SECTOR (BYTES_PER_SECTOR / 4)
int iTotalSingleIndexes = (iDataBlocks - 29) / INDEXES_PER_SECTOR;
扩展到此令牌序列:
int iTotalSingleIndexes = ( iDataBlocks - 29 ) / 64 / 4 ;
…由于/
运算符的关联性,编译器将其解析为:
int iTotalSingleIndexes = ((iDataBlocks - 29) / 64) / 4;
…其结果是值为1。如前所述,您需要:
#define INDEXES_PER_SECTOR (BYTES_PER_SECTOR / 4)
这使得每个扇区的索引扩展为一个完整的子表达式。到目前为止给出的两个答案都是正确的,所以接受其中一个,但我想我应该扩展一下他们所说的内容 预处理器宏的第一条规则 如果宏展开为表达式,请始终将展开括在括号中 预处理器宏的第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;
如果要使用预处理器完成预处理时间操作,可以使用Boost预处理库。但是,您确实应该为此使用const数据
const int BytesPerSector = 64;
const int IndexesPerSector = BytesPerSector / 4;
预处理器应该保留在您完全没有其他选择的情况下。在编译时执行算术很容易用const int完成