是什么“文件范围”和“计划范围”之间的区别(What is the difference betwe

2019-08-04 15:45发布

全局声明的变量是具有程序范围,所述
用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;  
}  

什么是这两者之间的区别?

Answer 1:

在C99,没有什么所谓的“计划范围”。 在您的示例变量x具有终止于翻译单元的端部的文件的范围。 变量yz所宣static也有文件范围,但具有内部链接。

C99(6.2.2 / 3)如果对象或功能的文件范围标识符的声明包含存储类说明静态的,标识符具有内部连接

另外,变量x具有外部连接,这意味着名称x可以是其它的转换单元或整个程序访问。

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



Answer 2:

声明为变量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中中的例子)。



Answer 3:

C程序可以写在几个文件中,这是通过连接组合成最终的执行。 如果你的整个程序是在一个文件中,则没有什么区别。 但在现实世界中复杂的软件,其中包括使用在不同的文件中的函数库,所不同的是显著。



Answer 4:

与文件范围的变量进行了声明点到文件的末尾才可见。 的文件指的是包含源代码的程序文件。 可以有一个大的程序中多个程序文件。 用程序作用域变量是所有文件内(不仅在其所定义的文件)在整个程序,函数和其他块可见的。 如需进一步信息。 检查: 用C范围和存储类型 。



文章来源: What is the difference between “File scope” and “program scope”