关于clang和gcc你需要注意的问题
Table of Contents
这两天写程序时遇到了许多clang和gcc规范的问题,明明自己Mac电脑上大样例都能过的程序交到OJ上一片WA和RE,百思不得其解怀疑是编译器问题,于是ssh到一台装了gcc的Linux机器上跑一下,果然结果和本地不一样。
-
函数传参的调用顺序
对于OIer而言,常见的一种优化程序常数的方法就是读入优化。用getchar手写输入,用putchar来取代手写输出。而许多人喜欢一种写法,就是写一个read函数,返回int类型,这样我们可以在调用函数的时候直接调用read,少写几行定义变量,然而,gcc和clang用这种方法时却存在差异。
在clang中,传递的参数默认从左边向右边调用,输入123 456,传给函数的便是a=123,b=456。而在gcc中,却有不同。这是gcc中运行同样代码的结果,可以看到,传递的参数从右边向左边调用。
-
位运算的异常
位运算也是一种优化程序和让程序更易读的方式,对于OIer而言,在状态压缩和二叉树节点编号中常用。
然而在clang中也有许多这样的坑。比如定义一个unsigned int a = 0xffffffff。
显而易见,它的二进制是全1。那么右移动32位,由于i>>k会被处理为i>>(k%sizeof(i)*8),所以相当于i>>0。
然而,gcc是这样,clang却不是。
而clang在处理位运算的时候似乎使用了一种不同于gcc的处理方式,所以我们还是手动%一下再操作吧。
1. 函数参数调用顺序是未定义的,所以你写了个UB
2. warning都给你了不能读一下吗