咋一看标题,你很有可能会不屑一顾。本人向来不愿意在自己仅有的那块博客空间里放一些被谈得发烂的东西。在写这篇文章之前,我还特地地Google了一下,没发现与此相关的内容。
这里将讨论关于C/C++中sizeof的一个不怎么为人所知的东西。
请先看下列代码:
#include <stdio.h> static char dummy(void) { puts("Hello, world!"); return '/0'; } int main(void) { printf("The size is: %d/n", sizeof(dummy)); }
呵呵,以上代码输出什么呢?大家不要凭感觉,请在你的编译器上先试试,C/C++都行。
大家不必大惊小怪。因为仅看到"The size is: 1“这样的结果是完全正常的。这就是本次的主题——sizeof与函数。
在ANSI-C89以及ISO/IEC C99/00中提到:
A function designator is an expression that has function type.
Except when it is the operand of the sizeof operator /25/ or the unary
& operator, a function designator with type ``function returning type
'' is converted to an expression that has type ``pointer to function
returning type .''
上面谈到对于一个函数指示符,如果它作为一个sizeof操作符的一个操作数,那么它就不是一个函数指针类型,而是一个函数类型。
在Intel编译器中,sizeof(dummy)直接编译报错。错误信息是:“sizeof操作数不能是函数“。而在GCC中,则返回1,而不管dummy的返回类型是什么。
如果dummy返回类型为void,那么sizeof(dummy)在ICPC中为0,在GCC中为1。
下面再看一下代码:
#include <stdio.h> static long dummy1(void) { puts("Hello, world!"); return '/0'; } static short dummy2(int); int main(void) { printf("The size is: %d/n", sizeof(dummy1())); printf("The size is: %d/n", sizeof(dummy2(100))); }
上述代码中,结果分别是4、2,即函数的返回类型大小。作为sizeof的操作数,函数不会被调用,sizeof(dummy1())的作用完全就是萃取dummy1的返回类型。
我们再看看以下代码:
int main(void) { int a = 10; printf("The answer is: %d and %d/n", sizeof(++a), a); printf("The answer is: %d and %d/n", sizeof(a += 100), a); }
我们可以看看输出。然后发现sizeof()操作中的表达式并未执行。所以函数没有被调用也就可以理解了。即,sizeof操作符中的表达式不会被计算,它仅仅获取表达式的返回类型的大小。