以下代码有什么问题?

时间:2011-03-25 18:21:44

标签: c

这段代码似乎在编译时会产生一些麻烦。有什么解释吗?

int i =20;
int maxlen = i;
int main()
{
     int j = i;
     printf("i=%d , j=%d\n", i , j);
}

3 个答案:

答案 0 :(得分:5)

在C中,您无法使用非常量表达式初始化全局变量。将maxlen初始化为i失败,因为i不是常量表达式。它是C标准的一部分。

为什么#define不是常数?

#define MAXLEN 20

答案 1 :(得分:5)

在初始化该范围内的变量时,您只能使用编译时常量。尝试:

int i = 20;
int maxlen;

int main()
{
   maxlen = i; // assign within the scope of a function
   int j = i;
   printf("i=%d , j=%d\n", i , j);
}

答案 2 :(得分:0)

此代码在 C 中无效,但在 C ++ 中有效:

C - http://www.ideone.com/mxgMo

错误原因 - :初始化元素不是常量

C ++ - http://www.ideone.com/XzoeU

<强>作品

由于:

C ++ 标准声明:

3.6.1主要功能[basic.start.main]

1程序应包含一个名为main的全局函数,它是程序的指定开始。实现定义是否需要独立环境中的程序来定义主函数。 [注意:在独立环境中,启动和终止是实现定义的; 启动包含具有静态存储持续时间的命名空间作用域对象的构造函数的执行;终止包含对具有静态存储持续时间的对象执行析构函数。 - 后注]

然而, C99 说:

56.7.8初始化

4初始化程序中具有静态存储持续时间的对象的所有表达式 应该是常量表达式或字符串文字。

所以不仅仅是您发布的代码,但是这样的内容在 C 中也无效:

#include<stdio.h>

int needint(void);

int i =needint();

int needint(void)
{
    return 1;
}

int main()
{
   int j = i;
   printf("i=%d , j=%d\n", i , j);
}

See here