web-dev-qa-db-de.com

statische und externe globale Variablen in C und C ++

Ich habe zwei Projekte erstellt, das erste in C und das zweite in C++. Beide funktionieren mit demselben Verhalten.

C-Projekt:

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;
}

C++ Projekt:

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;
}

Ich habe gelesen, dass globale Variablen standardmäßig extern sind und in C und statisch standardmäßig in C++; Warum funktioniert der C++ - Code?

Ich meine int varGlobal = 7; ist dasselbe wie static int varGlobal = 7; und wenn es statisch ist, kann es nur in der deklarierten Datei verwendet werden, oder?

26
Cristi

Globale Variablen sind in C und C++ standardmäßig weder extern noch static. Wenn Sie eine Variable als static deklarieren, beschränken Sie sie auf die aktuelle Quelldatei. Wenn Sie es als extern deklarieren, sagen Sie, dass die Variable existiert, aber an einer anderen Stelle deklariert wurde. Wenn Sie sie nicht an einer anderen Stelle deklarieren lassen (ohne das Schlüsselwort extern), erhalten Sie ein Verbindungsfehler (Symbol nicht gefunden).

Ihr Code bricht ab, wenn Sie mehr Quelldateien einschließlich dieses Headers haben. Bei der Link-Zeit haben Sie mehrere Verweise auf varGlobal. Wenn Sie es als static deklarieren, funktioniert es mit mehreren Quellen (ich meine, es wird kompiliert und verlinkt), aber jede Quelle hat ihr eigenes varGlobal.

In C++ können Sie die Variable wie folgt als const im Header deklarieren:

const int varGlobal = 7;

Und in mehrere Quellen einbinden, ohne die Verbindung zu unterbrechen. Die Idee ist, den alten C-Stil zu ersetzen #define für Konstanten.

Wenn Sie eine globale Variable benötigen, die in mehreren Quellen sichtbar ist, und nicht in const, deklarieren Sie sie in der Kopfzeile als extern und deklarieren Sie sie erneut in einer Quelldatei, diesmal ohne die externen Schlüssel:

Header von mehreren Dateien enthalten:

extern int varGlobal;

In einer Ihrer Quelldateien:

int varGlobal = 7;
76
fbafelipe

Wenn du #include eine Überschrift, es ist genau so, als ob Sie den Code in die Quelldatei selbst einfügen. In beiden Fällen ist die Variable varGlobal in der Quelle definiert, sodass sie unabhängig von der Deklaration funktioniert.

Wie in den Kommentaren erwähnt, sind C++ - Variablen im Dateibereich nicht statisch, obwohl sie statischem Speicher zugewiesen werden. Wenn die Variable beispielsweise ein Klassenmitglied wäre, müsste sie standardmäßig für andere Kompilierungseinheiten im Programm zugänglich sein, und Nichtklassenmitglieder unterscheiden sich nicht.

6
Mark Ransom