Chinaunix首页 | 论坛 | 博客

分类: C/C++

2015-01-20 21:46:43

如下程序,在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) |
给主人留下些什么吧!~~