36

我做了 2 个项目,第一个用 C 语言,第二个用 C++ 语言,两者都具有相同的行为。

C项目:

头文件.h

int varGlobal=7;

主程序

#include <stdio.h>
#include <stdlib.h>
#include "header.h"

void function(int i)
{
    static int a=0;
    a++;
    int t=i;
    i=varGlobal;
    varGlobal=t;
    printf("Call #%d:\ni=%d\nvarGlobal=%d\n\n",a,i,varGlobal,t);
}

int main() {
    function(4);
    function(6);
    function(12);
    return 0;
}

C++项目:

头文件.h

int varGlobal=7;

主文件

#include <iostream>
#include "header.h"
using namespace std;

void function(int i)
{
    static int a=0;
    int t=i;
    a++;
    i=varGlobal;
    varGlobal=t;
    cout<<"Call #"<<a<<":"<<endl<<"i="<<i<<endl<<"varGlobal="<<varGlobal<<endl<<endl; 
}

int main() {
    function(4);
    function(6);
    function(12);
    return 0;
}

我读到全局变量在默认情况下是外部变量,在 C 中是外部变量,在 C++ 中默认是静态的;那么为什么 C++ 代码有效呢?

我的意思是int varGlobal=7; 静态 int varGlobal=7 相同;如果它是静态的,那么它只能在它声明的文件中使用,对吧?

4

2 回答 2

95

全局变量在 C 和 C++中extern也不是默认的。static当您将变量声明为static时,您将其限制为当前源文件。如果您将其声明为extern,则表示该变量存在,但在其他地方定义,如果您没有在其他地方定义它(没有extern关键字),您将收到链接错误(找不到符号)。

当您有更多源文件(包括该标头)时,您的代码将中断,在链接时您将多次引用varGlobal. 如果您将其声明为static,那么它将与多个源一起使用(我的意思是,它将编译和链接),但每个源都有自己的varGlobal.

您可以在 C++ 中做而在 C 中不能做的事情是将变量声明为const在标头上,如下所示:

const int varGlobal = 7;

并包含在多个来源中,而不会在链接时破坏事物。这个想法是替换旧的 C 风格#define的常量。

如果您需要一个在多个源上可见的全局变量,而不是在头文件上const声明它extern,然后在源文件上定义它,这次不使用 extern 关键字:

多个文件包含的标头:

extern int varGlobal;

在您的一个源文件中:

int varGlobal = 7;
于 2012-06-15T18:19:49.467 回答
7

当您#include使用标头时,就好像您将代码放入源文件本身一样。在这两种情况下,varGlobal变量都是在源代码中定义的,因此无论它如何声明它都会起作用。

同样正如评论中所指出的,文件范围内的 C++ 变量在范围内不是静态的,即使它们将被分配给静态存储。例如,如果变量是类成员,则程序中的其他编译单元默认可以访问它,非类成员也不例外。

于 2012-06-15T17:55:52.450 回答