开发者社区> 问答> 正文

哈,坑大了,请教个问题。。。:报错

我将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 *”,两种类型定义方法,对相同代码可能引发错误。

展开
收起
kun坤 2020-06-06 22:32:02 500 0
1 条回答
写回答
取消 提交回答
  • 这么晚了,我是来帮顶的。。。。真心不会C######回复 @中山野鬼 : Microsoft认为自己就是标准。######多谢多谢。。。。。。。。。真心想不出windows为什么这么变态不按posix的标准走。。。。。######留名,php是最好的语言→_→######va_list 是个啥东西啊。######这是win的问题还是cygwin的问题啊?######

    引用来自“欣儿”的评论

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

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

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

    ######

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

    ######回复 @ZeroOne : 32bit 应该是 4,抱歉,我看错了,windows下面是char *######就算是32位吧,那结果也不应该是8,而应该是12。。。######

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

    和系统有关系,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下的方式处理。。。。######回复 @中山野鬼 : 恕我知道的很少,但是我看了下Cygwin里面的stdarg.h,没有的,里面有一个vararg.h,现在是空的,本来这个是Windows的定义(估计)######回复 @自由之信 : 我重复下我的问题,始终是“mac ,linux下的 va_list不是个char * ,win下是char * ,cygwin是否有正确的方式将va_list按照linux的规范来处理,而不是处理成char * ".哈######回复 @ZeroOne : 最可能是代码有问题,va_list的定义在Cygwin里面,本来就是char *,这并不影响va_list的使用######回复 @ZeroOne : 和_M_ALPHA没关系。现在也不是在谈重定义问题。哈。######没看我发给你的链接? 里面有一段话, YohanChn: 明白了,ANSI C/C++规定了6个ANSI Predefined Macros,是不能被用户定义或重定义的,而后Microsoft又补充了14个Microsoft-Specific Predefined Macros,也是不能被用户定义或重定义的。_M_ALPHA就是这14个中的一个。
    2020-06-08 11:18:47
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载