C语言 “文件范围”和“程序范围”有什么区别
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/14027317/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
What is the difference between "File scope" and "program scope"
提问by yuvanesh
A variable declared globally is said to having program scope
A variable declared globally with static keyword is said to have file scope.
全局声明的变量被称为具有程序范围
使用 static 关键字全局声明的变量被称为具有文件范围。
For example:
例如:
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;
}
What is the difference between these two?
这两者有什么区别?
采纳答案by cpx
In C99, there's nothing called "program scope". In your example variable xhas a file scope which terminates at the end of translation unit. Variables yand zwhich are declared staticalso have the file scope but with internal linkage.
在 C99 中,没有所谓的“程序范围”。在您的示例变量中x有一个文件范围,它在翻译单元的末尾终止。声明的变量y和也具有文件范围,但具有内部链接。zstatic
C99 (6.2.2/3) If the declaration of a file scope identifier for an object or a function contains the storage class specifier static, the identifier has internal linkage
C99 (6.2.2/3) 如果对象或函数的文件范围标识符声明包含存储类说明符 static,则标识符具有内部链接
Also, the variable xhas an external linkage which means the name xcan is accessible to other translation units or throughout the program.
此外,该变量x具有外部链接,这意味着x其他翻译单元或整个程序都可以访问该名称。
C99 (6.2.2/5) If the declaration of an identifier for an object has file scope and no storage-class specifier, its linkage is external.
C99 (6.2.2/5) 如果对象的标识符声明具有文件范围且没有存储类说明符,则其链接是外部的。
回答by Roman Dmitrienko
Variables declared as staticcannot be directly accessed from other files. On the contrary, non-staticones can be accessed from other files if declared as externin those other files.
声明为的变量static不能从其他文件直接访问。相反,static如果像extern在其他文件中一样声明,则可以从其他文件访问非文件。
Example:
例子:
foo.c
foo.c
int foodata;
static int foodata_private;
void foo()
{
foodata = 1;
foodata_private = 2;
}
foo.h
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;
}
Generally, one should avoid global variables. However, in real-world applications those are often useful. It is common to move the extern int foo;declarations to a shared header file (foo.h in the example).
通常,应该避免使用全局变量。但是,在实际应用中,这些通常很有用。将extern int foo;声明移动到共享头文件(示例中的 foo.h)是很常见的。
回答by Bhanuka Withana
A variable with file scope is only visible from its declaration point to the end of the file. A file refers to the program file that contains the source code. There can be more than one program files within a large program. Variables with program scope is visible within all files (not only in the file in which it is defined), functions, and other blocks in the entire program. For further info. check this : Scope and Storage Classes in C.
具有文件范围的变量仅从其声明点到文件末尾可见。文件是指包含源代码的程序文件。一个大程序中可以有多个程序文件。具有程序范围的变量在整个程序中的所有文件(不仅在定义它的文件中)、函数和其他块中都是可见的。欲了解更多信息。检查这个:C 中的范围和存储类。
回答by Devin Ceartas
C programs can be written in several files, which are combined by a linker into the final execution. If your entire program is in one file, then there is no difference. But in real-world complex software which includes the use of libraries of functions in distinct files, the difference is significant.
C 程序可以写在几个文件中,这些文件由链接器组合成最终执行。如果您的整个程序都在一个文件中,则没有区别。但在现实世界的复杂软件中,包括在不同文件中使用函数库,差异是显着的。

