c语言 - "File scope"和"program scope"有什么区别



据说有一个程序范围
用静态关键字在全球声明的变量据说具有文件范围。

例如:

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;  
}  

这两个之间有什么区别?

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

示例:

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("%dn", foodata); /* OK */
    return 0;
}

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

在C99中,没有什么称为"程序范围"。在您的示例中,变量x具有一个文件范围,该文件范围在翻译单元末尾终止。变量yz被声明为static也具有文件范围,但具有内部链接。

c99(6.2.2/3)如果对象的文件范围标识符声明 或一个函数包含存储类规范静态, 标识符具有内部链接

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

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

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

只有从其声明点到文件末尾才能看到具有文件范围的变量。文件是指包含源代码的程序文件。大程序中可以有多个程序文件。在所有文件中(不仅在定义的文件中),函数和整个程序中的其他块中都可以看到具有程序范围的变量。有关更多信息。检查以下内容:

中的范围和存储类

相关内容

  • 没有找到相关文章

最新更新