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

Chr*_*ris 3 c c++

我有这个预处理器指令:

#define INDEXES_PER_SECTOR BYTES_PER_SECTOR / 4
Run Code Online (Sandbox Code Playgroud)

其中BYTES_PER_SECTOR在另一个头文件中声明为:

#define BYTES_PER_SECTOR    64
Run Code Online (Sandbox Code Playgroud)

我有这个简单的数学方程式,我写的在执行后我得到一个断言错误,因为分配给iTotalSingleIndexes的值不正确.

int iTotalSingleIndexes = (iDataBlocks - 29) / INDEXES_PER_SECTOR;
Run Code Online (Sandbox Code Playgroud)

现在我认为这是因为预处理器指令INDEXES_PER_SECTOR.在执行我的等式时,iDataBlocks是285,这是正确的.我用gdb证实了这一点.问题是,当它应该是16时,分配给iTotalSingleIndexes的值是1.我真的不知道为什么会发生这种情况.

当我做的事情:

int iIndexesInASector = INDEXES_PER_SECTOR;
int iTotalSingleIndexes = (iDataBlocks - 29) / iIndexesInASector;
Run Code Online (Sandbox Code Playgroud)

将正确的值分配给iTotalSingleIndexes.

在其他注释中,我在其他方程式中使用预处理器指令,它们工作正常,所以我更加困惑.

任何帮助将非常感激.

caf*_*caf 17

预处理器只是执行令牌替换 - 它不会计算表达式.你的线路:

int iTotalSingleIndexes = (iDataBlocks - 29) / INDEXES_PER_SECTOR;
Run Code Online (Sandbox Code Playgroud)

扩展到这个令牌序列:

int iTotalSingleIndexes = ( iDataBlocks - 29 ) / 64 / 4 ;
Run Code Online (Sandbox Code Playgroud)

...由于/运算符的关联性,编译器将其解析为:

int iTotalSingleIndexes = ((iDataBlocks - 29) / 64) / 4;
Run Code Online (Sandbox Code Playgroud)

...导致值为1.正如leppie所说,你想要:

#define INDEXES_PER_SECTOR (BYTES_PER_SECTOR / 4)
Run Code Online (Sandbox Code Playgroud)

这使得INDEXES_PER_SECTOR扩展到完整的子表达式.


lep*_*pie 7

#define INDEXES_PER_SECTOR (BYTES_PER_SECTOR / 4)
Run Code Online (Sandbox Code Playgroud)