跨平台c++编程差异小结

     windows下用vs2008,linux下用g++4.1 。如果程序符合c++标准写法,大体都能编译过去,不过以下几点得另行处理:
     1)数据类型:比如__int64和long long。最好把所有基本数据类型定义在一个头文件里,使用条件编译保证平台无关。
     2)比较常用函数:比如Sleep和sleep,atoi64和atoll等等。前者可以再次祭出条件编译,后者不如转而使用boost::lexical_cast好了。boost能搞定就用boost,不能就用条件编译。boost库为跨平台编程提供了很多很有用的类库,用得好可以省很多功夫。
     3)编译器的不同要求,总的来说,g++要求更严格些。以下几点是我碰到过的,当然不全:
         a) g++不能识别两个模板括号>>,vector<vector<int>> vi编译会出错,要这么些vector<vector<int> > vi,嘿嘿,加个空格,世界太平。
         b) g++里的头文件和源码文件末尾最后都好以空行结尾,否则警告。
         c) vs里很多乱七八糟的警告,比如建议使用strcpy_s等。我建议是用# pragma warning 干掉这几类警告
         d) vs可以在类的头文件里直接定义static const int 变量,g++不行,它会认为那只是声明,还要求定义。
         e) hash_map所属位置和namespace不一样,可用条件编译搞定,但是linux下的居然不支持64位int作为key,哐当。自己写hash_map或者hash_func吧。泪奔。
         f)  vs2008不支持函数声明throw,类似void foo() throw (int);会警告,而且相当于没起作用。不过我觉得这个功能本身也很没用。
         g) 类(假设为A)的静态变量(假设为i),vs可以用A::i 和A.i两种方式访问,g++只支持前者
         h) vs2008里main函数可以不返回,g++必须返回。
         i) 模板类A中又定义了一个类B,vs可以这么使用:“A<int>::B b;”g++必须加上typename:“typename A<int>::B b;”
         j) 未完待续,等我想起来了或者遇到了再补上
    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值