“文件范围”和“程序范围”之间有什么区别

时间:2012-12-25 02:58:54

标签: c scope storage-class-specifier

全局声明的变量据说具有程序范围
 使用static关键字全局声明的变量据说具有文件范围。

例如:

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 个答案:

答案 0 :(得分:15)

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

示例:

foo.c的

int foodata;
static int foodata_private;

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

foo.h中

void foo();

的main.c

#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)是很常见的。

答案 1 :(得分:13)

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

  

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

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

  

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

答案 2 :(得分:0)

C程序可以用几个文件编写,这些文件由链接器组合成最终执行。如果您的整个程序都在一个文件中,那么没有区别。但在真实世界的复杂软件中,包括在不同文件中使用函数库,差别很大。

答案 3 :(得分:0)

具有文件范围的变量仅在其声明点到文件末尾可见。文件是指包含源代码的程序文件。大型程序中可以有多个程序文件。 具有程序范围的变量在所有文件中(不仅在定义它的文件中),函数和整个程序中的其他块中可见。 有关详细信息。检查一下:Scope and Storage Classes in C