如下程序,在windows下输出是1,在Linux下输出是0.
#include
#include
bool istrue()
{
return 0;
}
typedef int(*test_cb_t) ();
int main()
{
test_cb_t func = (test_cb_t)istrue;
bool b = func();
printf("%d\n", b);
return 0;
}
解释这个问题,得从汇编来看:
Linux 下:istrue的最后一条指令是
mov $0x0, %eax. 在func调用之后的汇编语句是,
test %eax, %eax; setne %al; mov %al, %esp. 总的来说,gcc在翻译return false;这
条语句的时候直接将eax设置为0,(也有可能是test_cb_t的返回值是int)。
Windows下:istrue的最后一条指令是xor al, al. 所以在istrue返回之后,只是保证了al为0,
但是eax是否为0,并不保证。call指令执行完毕以后,test eax eax 来给b赋值。所以b为true。
当你在windows下进行源代码调试的时候会发现:命名istrue返回的是false,怎么b的值就变成
true了呢?
从各自的反汇编来看,我们应该谨慎的使用强制类型转换,
尤其是在返回值方面。
阅读(2758) | 评论(0) | 转发(0) |