回答
唯一的区别是文件变量只能在文件内部访问。但他们有相同的生活时间。
在C和C++中,您可以创建一个全局变量,只能通过在声明前使用static关键字声明的文件来访问它。不使用static关键字的全局变量可以从编译到程序中的任何C或C++文件访问。
静态全局方法在C++中被弃用,以支持匿名命名空间。任何放置在匿名命名空间内的声明也只能从该文件中访问。
C++程序一次编译一个翻译单元(基本上这意味着每个.cpp文件都是独立编译的)。
默认情况下,变量不const
,功能不inline
和typedef
■找内部链接:这意味着他们不给其他翻译单元可见。如果其他翻译单元引用具有内部链接的符号(在声明之后,它需要变量的关键字extern
),链接器将无法找到它们。
要明确要求内部链接,请使用关键字static
或更好地使用未命名的名称空间。
注意:这些规则同样适用于C++以及C,并与类/结构/命名空间范围进行了一些处理。 (我没有注意到问题是关于C++,而不是C)。
记住(在大多数情况下)C源文件被编译到目标文件中。目标文件有一个“导出”表,它告诉链接器(链接时)它提供的符号。符号是一个名称(它的确切名称取决于ABI)是指一个函数或变量(大多数情况下)。
当您在C源文件中声明一个全局变量,像这样:
// fileA.c
int hello = 42;
void printMessage() {
printf("Hello, %d world(s)!\n", hello);
}
hello
和printMessage
出口。当一个C目标文件请求一个名为'hello
'的符号(假设一个简单的ABI)时,链接器将它连接到由fileA.c
导出的hello
。
现在为另一种情况。当你声明这样的文件局部变量:
// fileB.c
static int world = 9001;
static void messagePrint() {
printf("It's over %d!\n", world);
}
world
和messagePrint
是不出口。当一个C目标文件请求一个名为'hello
'的符号时,链接器无法将它与fileB.c
的hello
连接起来,因为在fileB.obj
(或其他)中没有关于它的信息。
messagePrint
怎么能知道world
,但?两者都在同一翻译单位。范围在这里接管。我相信你会在scope through Google找到很多信息。
(是否符号名称与C中的函数/变量名称标准匹配?我知道它对于C++而言是不同的(这里没有名称修改的标准化),这就是为什么我首先提到ABI。)
((如果ABI正确的称呼,连; P))
- 1. C#中的全局变量
- 2. C中的全局变量#
- 3. 全局变量,C
- 4. C#全局变量
- 5. 变量全局变量?
- 6. xml文件中的全局变量
- 7. 多个文件中的全局变量
- 8. cpp文件中的全局变量
- 9. dlopen和C/C++中的全局变量
- 10. c目标c中的全局变量
- 11. NASM X86_64全局变量C
- 12. C++构建全局变量
- 13. C++和全局变量
- 14. Objective-C和全局变量
- 15. objective-c - 全局变量
- 16. C# - Winforms - 全局变量
- 17. 全局变量类C++
- 18. 全局变量
- 19. 全局变量
- 20. 全局变量?
- 21. 全局变量
- 22. 全局变量
- 23. 全局变量
- 24. 全局变量
- 25. 全局变量
- 26. lotusscript中的全局变量如何全局变量IBM Notes 9
- 27. 变量名称的PHP全局变量
- 28. 全局变量到文本文件
- 29. 跨文件的PHP全局变量
- 30. java独立文件的全局变量
借口,我的无知,但我来自AA主要是C/Objective C的背景,我从来没有听说过一个文件变的... 待办事项你的意思是一个全局变量,它只在它定义的文件中可见? – hhafez 2009-02-10 22:50:54
澄清:我认为你的意思是否使用关键字“静态”? (静态全局变量只在该文件中可见) – 2009-02-10 22:51:23