14
回答
哈,坑大了,请教个问题。。。
终于搞明白,存储TCO原来是这样算的>>>   

我将linux的代码,放到win 7下的cygwin里进行编译和执行。 死的比较难看。跟踪到的错误,实际是在三个平台上存在两种不同的情况。


mac os 下,apple llvm 5.0  ,  sizeof(va_list) == 24

(ubuntu) linux 下,gcc 4.8.2 , target x86_64-linux-gnu ,sizeof (va_list) == 24

cygwin(win7)下, gcc 4.8.3 ,target x86_64-pc-cygwin,sizeof (va_list) == 8

即便makefile 的 CFLAGS 增加  -D_M_ALPHA ,仍然无效,现在只能通过把 va_list ,va_start 等等用宏裹一层的方式,自定义选择性的实现。

是否与靠谱的方式,通过cygwin的gcc的参数配置,让 sizeof(va_list) == 24 。

有段时间没有在win下玩代码了。。。。把这个差异忘记了。cygwin里的坑但愿只有一个。。。。。。

有跌过爬出来的,给个比较规范的方法(非自行定义宏开关实现),多谢。

补充说一句,抓这个bug,mac os ,ubuntu ,win7+cygwin 三个平台同时测,体验度 mac os (这是生活),ubuntu (这是工作), win7+cygwin(这是坐牢)。。。哈不起来了,shit一把。。。。

补充总结下问题的描述,“win ,cygwin 下, va_list 被定义成char *,而 mac linux上不是如此,怎么解决按照mac os 或linux的方式编写的代码,对于va_list 在cygwin下不被定义成char *”,两种类型定义方法,对相同代码可能引发错误。

举报
中山野鬼
发帖于3年前 14回/965阅
共有14个答案 最后回答: 3年前

引用来自“欣儿”的评论

这是win的问题还是cygwin的问题啊?

WIN下,是直接使用可变参存储的指针的,这个我以前有影响,va_list params;这个参数传入子函数出来,是不变的。。。mac和linux下,va_list是一个结构体,实际可变参存储的指针是在结构体内的,所以params传入后,子函数对可变参的调整是可以在其他函数中体现出来的。

我怀疑8成是cygwin的错误。。。

和系统有关系,MAC OS 和 Linux 是64位的,Windows 可能是 32 位的,确定是否用了64位的系统和编译器...

--- 共有 2 条评论 ---
自由之信回复 @ZeroOne : 32bit 应该是 4,抱歉,我看错了,windows下面是char * 3年前 回复
甘薯就算是32位吧,那结果也不应该是8,而应该是12。。。 3年前 回复

引用来自“自由之信”的评论

和系统有关系,MAC OS 和 Linux 是64位的,Windows 可能是 32 位的,确定是否用了64位的系统和编译器...

一个指针的sizeof是8个byte,难道32位有这个功能吗?哈。

sizeof(va_list) == 8 ,意思是说,他采用了 

typedef char * va_list;

的方式定义,而mac 和 linux 下,显然不是这么定义。。。

鬼鬼,

是否和字节对齐方式有关系?

既然va_list是一个struct.

这里有一篇百度知道不晓得是否有用: http://zhidao.baidu.com/link?url=oCUdbozYmFqCVfyNgZ0T1_Tl0xjMHxzNszyiVHJXOgpk_XNDP50W8WipJaeBYwjW8_lClEjTcgs2srnIP9C-_aurl=oCUdbozYmFqCVfyNgZ0T1_Tl0xjMHxzNszyiVHJXOgpk_XNDP50W8WipJaeBYwjW8_lClEjTcgs2srnIP9C-_a

windows是不允许重新定义

_M_ALPHA 这个编译参数的


引用来自“中山野鬼”的评论

引用来自“自由之信”的评论

和系统有关系,MAC OS 和 Linux 是64位的,Windows 可能是 32 位的,确定是否用了64位的系统和编译器...

一个指针的sizeof是8个byte,难道32位有这个功能吗?哈。

sizeof(va_list) == 8 ,意思是说,他采用了 

typedef char * va_list;

的方式定义,而mac 和 linux 下,显然不是这么定义。。。

抱歉,我知道,因为两个的ABI接口定义不一样,所以定义的有所不同,不过这应该不影响其va_list的使用,如果使用方式正确的话,我觉得把你使用的这部分代码贴出来,看看会好一点


引用来自“ZeroOne”的评论

鬼鬼,

是否和字节对齐方式有关系?

既然va_list是一个struct.

这里有一篇百度知道不晓得是否有用: http://zhidao.baidu.com/link?url=oCUdbozYmFqCVfyNgZ0T1_Tl0xjMHxzNszyiVHJXOgpk_XNDP50W8WipJaeBYwjW8_lClEjTcgs2srnIP9C-_aurl=oCUdbozYmFqCVfyNgZ0T1_Tl0xjMHxzNszyiVHJXOgpk_XNDP50W8WipJaeBYwjW8_lClEjTcgs2srnIP9C-_a

windows是不允许重新定义

_M_ALPHA 这个编译参数的


和字节对齐没关系哦。win下面就是 typedef char * va_list ;,我是奇怪,为什么cygwin不能按照linux下的方式处理。。。。
--- 共有 5 条评论 ---
自由之信回复 @中山野鬼 : 恕我知道的很少,但是我看了下Cygwin里面的stdarg.h,没有的,里面有一个vararg.h,现在是空的,本来这个是Windows的定义(估计) 3年前 回复
中山野鬼回复 @自由之信 : 我重复下我的问题,始终是“mac ,linux下的 va_list不是个char * ,win下是char * ,cygwin是否有正确的方式将va_list按照linux的规范来处理,而不是处理成char * ".哈 3年前 回复
自由之信回复 @ZeroOne : 最可能是代码有问题,va_list的定义在Cygwin里面,本来就是char *,这并不影响va_list的使用 3年前 回复
中山野鬼回复 @ZeroOne : 和_M_ALPHA没关系。现在也不是在谈重定义问题。哈。 3年前 回复
甘薯没看我发给你的链接? 里面有一段话, YohanChn: 明白了,ANSI C/C++规定了6个ANSI Predefined Macros,是不能被用户定义或重定义的,而后Microsoft又补充了14个Microsoft-Specific Predefined Macros,也是不能被用户定义或重定义的。_M_ALPHA就是这14个中的一个。 3年前 回复
顶部