关于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的处理方式,所以我们还是手动%一下再操作吧。

 

One Response

  1. 1. 函数参数调用顺序是未定义的,所以你写了个UB
    2. warning都给你了不能读一下吗

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to Top