2009-02-10 82 views
7

C++中的全局变量和文件变量有什么区别?全局变量V.S. C++中的文件变量

谢谢!

+0

借口,我的无知,但我来自AA主要是C/Objective C的背景,我从来没有听说过一个文件变的... 待办事项你的意思是一个全局变量,它只在它定义的文件中可见? – hhafez 2009-02-10 22:50:54

+0

澄清:我认为你的意思是否使用关键字“静态”? (静态全局变量只在该文件中可见) – 2009-02-10 22:51:23

回答

0

唯一的区别是文件变量只能在文件内部访问。但他们有相同的生活时间。

12

在C和C++中,您可以创建一个全局变量,只能通过在声明前使用static关键字声明的文件来访问它。不使用static关键字的全局变量可以从编译到程序中的任何C或C++文件访问。

静态全局方法在C++中被弃用,以支持匿名命名空间。任何放置在匿名命名空间内的声明也只能从该文件中访问。

6

C++程序一次编译一个翻译单元(基本上这意味着每个.cpp文件都是独立编译的)。

默认情况下,变量不const,功能不inlinetypedef■找内部链接:这意味着他们不给其他翻译单元可见。如果其他翻译单元引用具有内部链接的符号(在声明之后,它需要变量的关键字extern),链接器将无法找到它们。

要明确要求内部链接,请使用关键字static或更好地使用未命名的名称空间。

3

注意:这些规则同样适用于C++以及C,并与类/结构/命名空间范围进行了一些处理。 (我没有注意到问题是关于C++,而不是C)。

记住(在大多数情况下)C源文件被编译到目标文件中。目标文件有一个“导出”表,它告诉链接器(链接时)它提供的符号。符号是一个名称(它的确切名称取决于ABI)是指一个函数或变量(大多数情况下)。

当您在C源文件中声明一个全局变量,像这样:

// fileA.c 
int hello = 42; 

void printMessage() { 
    printf("Hello, %d world(s)!\n", hello); 
} 

helloprintMessage出口。当一个C目标文件请求一个名为'hello'的符号(假设一个简单的ABI)时,链接器将它连接到由fileA.c导出的hello

现在为另一种情况。当你声明这样的文件局部变量:

// fileB.c 
static int world = 9001; 

static void messagePrint() { 
    printf("It's over %d!\n", world); 
} 

worldmessagePrint出口。当一个C目标文件请求一个名为'hello'的符号时,链接器无法将它与fileB.chello连接起来,因为在fileB.obj(或其他)中没有关于它的信息。

messagePrint怎么能知道world,但?两者都在同一翻译单位。范围在这里接管。我相信你会在scope through Google找到很多信息。

(是否符号名称与C中的函数/变量名称标准匹配?我知道它对于C++而言是不同的(这里没有名称修改的标准化),这就是为什么我首先提到ABI。)

((如果ABI正确的称呼,连; P))