繁体   English   中英

C 和 C++ 中的静态和外部全局变量

[英]static and extern global variables in C and C++

我做了 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;
}

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

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

默认情况下,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;

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM