在C中,为什么在单独的语句中定义全局变量会引发警告,但对于局部变量是否可以?

时间:2013-03-31 21:45:26

标签: c expression declaration

在下面的代码中,为什么全局变量“x”的定义显示警告“数据定义没有类型或存储类”,但同样的事情适用于局部变量“y”?我只是在做什么对于每个变量,首先在一个语句中声明它们,然后在另一个语句中定义它们。它对一个变量有效但是对另一个变量显示警告的区别是什么?

    #include<stdio.h>

      int x;
      x=303;

     int main(void)
      {
        int y;
        y=776 ;

        printf("The value of x is %d,and of y is %d",x,y);
      }

3 个答案:

答案 0 :(得分:6)

您正在C89模式下进行编译。

  int x;

x的暂定定义。

  x=303;
然后将

解释为具有隐式类型xint)的变量int x = 303;的定义。在C99或更高版本下,该代码将无法编译,因为“隐式int”规则被废除且没有“隐式int”规则,第二行只能被解释为语句,而不是允许在文件范围内。

使用-std=c89 -Wall -Wextra -pedantic进行编译(并向return 0;添加main),gcc警告

redef.c:4:1: warning: data definition has no type or storage class [enabled by default]
redef.c:4:1: warning: type defaults to ‘int’ in declaration of ‘x’ [-Wimplicit-int]

答案 1 :(得分:3)

原因是这两行:

  int x;
  x = 303;

由声明语句(int x;)和用作语句(x = 303;)的表达式组成。 C编程语言仅允许在全局范围级别进行声明和定义,并且不允许在全局范围内使用表达式。但是,声明语句和表达式语句在C函数内部都是合法的。

考虑这一点的一种直观方式如下:何时在全局范围内执行代码x = 303;?想象一下,我们有这个程序:

int x = 1;

void myFunction() {
    printf("%d\n", x);
}

x = 303;

此处xmyFunction看到什么价值?它会看到值1,还是会看到值303?

另一方面,如果我们有

void myFunction() {
    int x;
    x = 303;
    printf("%d\n", x);
}

我们应该按顺序执行这些语句,这样会更清楚,因此会打印303

希望这有帮助!

答案 2 :(得分:1)

您无法在任何函数/块之外执行代码。 x=303;在您编写它的位置无效。

在这个精确的情况下(全局范围),您只能使用int x=303直接初始化变量。