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)
未完待续,等我想起来了或者遇到了再补上