Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用预处理器指令从数学方程生成的值错误_C++_C - Fatal编程技术网

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完成