奇怪的gcc行为
有人报告了gcc一个奇怪的行为,这样的一段代码居然能够通过编译。
#include <cstdio>
#define NUM getnum()
int getnum()
{
int x = 0;
scanf("%d", &x);
printf("%d\n", x);
return x;
}
int main()
{
int array[NUM];
printf("array size =%d\n",sizeof(array));
return 0;
}
要命的是,编译之后居然还能运行。sizeof可以是运行期间确定的吗?
为了确定问题所在,我用-E选项对源代码进行预处理展开,对展开的代码再重新进行编译,居然还是通过了。这意味着问题根本不是由于那个宏引起的。于是,这样的代码也就通过了编译。
#include <cstdio>
int getnum()
{
int x = 0;
scanf("%d", &x);
printf("%d\n", x);
return x;
}
int main()
{
int array[getnum()];
printf("array size =%d\n",sizeof(array));
return 0;
}
本来sizeof应该是编译期间常数,居然现在连运行期间常数都不是了。不知道gcc做了什么样的优化导致了这个问题。如果再把template参数掺和进来,岂不是会更有意思?
有地方说在C99以后,数组有两种定义:一种是大小是编译期间常数的,另外一种则不是。区别在于,前者分配在stack上,后者分配在heap上。并且在两者上执行sizeof也有不同的效果。
on August 13th, 2008 | No Comments »
