fmddlmyy的专栏

伐木丁丁鸟鸣嘤嘤

吕杰ID:fmddlmyy
80488次访问,排名1186好友2人,关注者5
伐木丁丁鸟鸣嘤嘤
fmddlmyy的文章
原创 40 篇
翻译 0 篇
转载 0 篇
评论 94 篇
fmddlmyy的公告

最近评论
慧军:还是设计自己的UI方案比较好,不能认为WM流行就照抄WM的。WM更大的市场是在商业应用,UI上面就不见得好了。
abbot:very good!
htbegin:很不错!
luxiaoyan:我安装了doxygen, graphviz, 生成的的文档无法显示类图,不知道是怎么回事,请各位帮忙解决一下,谢谢阿。
liaoliaopro:这个应该是表达式求值顺序的问题吧?gcc从左开始求值,vc从右开始求值,最后产生这样的结果。
文章分类
收藏
    相册
    个人主页
    fmddlmyy的留言板
    Mime 手机中文输入引擎
    伐木丁丁鸟鸣嘤嘤——我的个人主页
    历法计算程序
    我的程序
    我的随笔集
    存档
    订阅我的博客
    XML聚合  FeedSky

    原创 一个编译器的小陷阱收藏

    新一篇: 谈谈对齐(上) | 旧一篇: Linux之旅(2): 你好,GTK (上)

     

    一个编译器的小陷阱

    有时候在一个平台运行正确的程序,在另一个平台就会出问题。在平台移植中,最常见的问题可能就是字节序和对齐这类问题了。本文记录的是我以前碰到过的一个小陷阱。看看这段代码的输出应该是什么?

    #include "stdio.h"
    
    char do_something(int *p)
    {
    	*p = 5;
    	return 'x';
    }
    
    void test1(void)
    {
    	char s[] = "abcdef";
    	int index = 0;
    	s[index] = do_something(&index);
    	printf("%s\n", s);
    }
    
    int main(void)
    {
    	test1();
    	return 0;
    }
    

    如果我们使用VC编译器或ARM编译器,它的输出是abcdex。如果我们使用gcc,它的输出是xbcdef。关键在于这句:

    	s[index] = do_something(&index);
    

    等号左侧的index在等号右侧被改变了。VC和ARM编译器使用改变后的index(值为5),gcc编译器使用改变前的index(值为0)。我实际碰到的代码当然要复杂的多,在上万行代码中找到这行代码可不是一件让人愉快的事情。其实,解决此类编译器陷阱的最好方法就是:不要写可能产生歧义的语句。从本例我们应该记住:

    • 在赋值语句中,等号左侧使用的数组索引或指针偏移在等号右侧不应被改变。

    你碰到过类似的陷阱吗?

    发表于 @ 2008年07月15日 21:37:00|评论(loading...)|编辑|收藏

    新一篇: 谈谈对齐(上) | 旧一篇: Linux之旅(2): 你好,GTK (上)

    评论

    #liaoliaopro 发表于2008-07-16 16:19:42  IP: 58.60.233.*
    这个应该是表达式求值顺序的问题吧?gcc从左开始求值,vc从右开始求值,最后产生这样的结果。
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © fmddlmyy