Статические и внешние глобальные переменные в C и С++
Я сделал 2 проекта, первый в C и второй в С++, оба работают с одинаковым поведением.
C проект:
header.h
int varGlobal=7;
main.c
#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;
}
Проект С++:
header.h
int varGlobal=7;
main.cpp
#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 и статические - в С++; так почему код С++ работает?
Я имею в виду int varGlobal = 7; такое же, как static int varGlobal = 7; и если он статический, то он может использоваться только в объявленном файле?
Ответы
Ответ 1
Глобальные переменные не являются extern
и static
по умолчанию на C и С++.
Когда вы объявляете переменную как static
, вы ограничиваете ее текущим исходным файлом. Если вы объявите его как extern
, вы говорите, что переменная существует, но объявлены где-то в другом месте, и если вы ее не объявили в другом месте (без ключевого слова extern
), вы получите ошибку ссылки (символ не найдено).
Ваш код сломается, когда у вас будет больше исходных файлов, включая этот заголовок, во время ссылки у вас будет несколько ссылок на varGlobal
. Если вы объявите его как static
, то он будет работать с несколькими источниками (я имею в виду, он будет компилировать и связывать), но каждый источник будет иметь свой собственный varGlobal
.
Что вы можете сделать в С++, что вы не можете в C, - объявить переменную как const
в заголовке, например:
const int varGlobal = 7;
И включите в несколько источников, не нарушая при ссылке время. Идея состоит в том, чтобы заменить старый стиль C #define
на константы.
Если вам нужна глобальная переменная, видимая в нескольких источниках, а не const
, объявите ее как extern
в заголовке и объявите ее снова, на этот раз без внешнего ключа в исходном файле:
Заголовок, включенный несколькими файлами:
extern int varGlobal;
В одном из ваших исходных файлов:
int varGlobal = 7;
Ответ 2
Когда вы #include
заголовок, это точно так же, как если бы вы поместили код в исходный файл. В обоих случаях переменная varGlobal
определяется в источнике, поэтому она будет работать независимо от того, как она объявлена.
Также, как указано в комментариях, переменные С++ в области файлов не являются статичными по охвату, даже если они будут назначены статическому хранилищу. Если переменная была членом класса, например, она должна была быть доступна для других единиц компиляции в программе по умолчанию, а члены некласса не различаются.