[英]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.