这不是gcc的bug

一些人说,gcc可以安静地编译下面的程序:


void foo(void *p)
{
++p;
}

所以这是gcc的一个bug。很不幸,这一个feature,而不是bug。gcc手册中明显地提到:

In GNU C, addition and subtraction operations are supported on pointers
to void' and on pointers to functions. This is done by treating the size of avoid’ or of a function as 1.
如果你对此不满,那就打开-Wpointer-arith。(不过话说回来了,-Wall -W居然都不会打开这个选项~~)而Intel C编译器就可以给出警告:


foo.c(3): warning #1338: arithmetic on pointer to void or function type
++p;
^

当然了,标准肯定是不允许对void*进行算术操作,原因很简单,因为它指向的对象大小不知道。参见C99 6.5.6。