Подтвердить что ты не робот

Статические и внешние глобальные переменные в 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; и если он статический, то он может использоваться только в объявленном файле?

4b9b3361

Ответ 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 определяется в источнике, поэтому она будет работать независимо от того, как она объявлена.

Также, как указано в комментариях, переменные С++ в области файлов не являются статичными по охвату, даже если они будут назначены статическому хранилищу. Если переменная была членом класса, например, она должна была быть доступна для других единиц компиляции в программе по умолчанию, а члены некласса не различаются.