22

全局声明的变量被称为具有程序范围
使用静态关键字全局声明的变量被称为具有文件范围。

例如:

int x = 0;             // **program scope**   
static int y = 0;      // **file scope**  
static float z = 0.0;  // **file scope** 

int main()  
{  
   int i;   /* block scope */  
   /* .
      .
      .
   */ 
   return 0;  
}  

这两者有什么区别?

4

4 回答 4

18

声明为的变量static不能直接从其他文件访问。相反,static如果在其他文件中声明,则可以从其他文件访问非extern文件。

例子:

foo.c

int foodata;
static int foodata_private;

void foo()
{
    foodata = 1;
    foodata_private = 2;
}

foo.h

void foo();

主程序

#include "foo.h"
#include <stdio.h>

int main()
{
    extern int foodata; /* OK */
    extern int foodata_private; /* error, won't compile */

    foo();

    printf("%d\n", foodata); /* OK */

    return 0;
}

通常,应避免使用全局变量。但是,在实际应用中,这些通常很有用。通常将extern int foo;声明移动到共享头文件(示例中为 foo.h)。

于 2012-12-25T03:09:55.643 回答
15

在 C99 中,没有所谓的“程序范围”。在您的示例变量x中,文件范围在翻译单元的末尾终止。声明的变量y也具有文件范围,但具有内部链接。zstatic

C99 (6.2.2/3) 如果对象或函数的文件范围标识符的声明包含存储类说明符 static,则该标识符具有内部链接

此外,该变量x具有外部链接,这意味着x其他翻译单元或整个程序都可以访问该名称。

C99 (6.2.2/5) 如果对象标识符的声明具有文件范围且没有存储类说明符,则其链接是外部的。

于 2012-12-25T03:28:47.977 回答
0

C 程序可以写在几个文件中,这些文件由链接器组合到最终执行中。如果您的整个程序都在一个文件中,则没有区别。但是在现实世界的复杂软件中,包括在不同文件中使用函数库,差异是显着的。

于 2012-12-25T03:06:05.680 回答
0

具有文件范围的变量仅从其声明点到文件末尾可见。文件是指包含源代码的程序文件。一个大程序中可以有多个程序文件。具有程序范围的变量在整个程序中的所有文件(不仅在定义它的文件中)、函数和其他块中都是可见的。了解更多信息。检查这个:C 中的范围和存储类

于 2012-12-25T03:10:11.980 回答