2016-04-15 13 views

Antwort

2

Angenommen, Ihre Variable ist global und nicht statisch.

Sie müssen es in einer Header-Datei deklarieren. Wir verwenden hierfür das Schlüsselwort extern. Wie in Kommentaren erwähnt, ist dieses Schlüsselwort nicht notwendig, aber die meisten C-Benutzer bevorzugen es, es in Kopfzeilen zu verwenden, dies ist eine Konvention.

stackoverflow.h:

#ifndef STACHOVERFLOW_H 
#define STACHOVERFLOW_H 

extern int my_var; 

#ifndef 

Und Sie es in Quelldatei initialisieren. (Die Verwendung des Schlüsselworts extern ist nicht zulässig, wenn Sie einen Initialisierungswert angeben möchten).

stackoverflow.c

#include "stackoverflow.h" 

int my_var = 50; 

Legen Initialisierungswert nicht in einem Header, oder Sie werden einen Linker Fehler, wenn der Header mindestens zweimal verwendet wird.

Jetzt können Sie Ihre Variable in jedem anderen Modul verwenden, indem Sie die Kopfzeile einfügen.

main.c

#include <stdio.h> 
#include "stackoverflow.h" 

int main() 
{ 
    printf("my_var = %d\n", my_var); 
    return 0; 
} 

Einschließlich header "stackoverflow.h" in "stackoverflow.c" ist ein Weg, um sicherzustellen Definitionen in Quelldatei übereinstimmen Erklärungen in Header-Datei zu erhalten. Dies erlaubt Fehler bei der Kompilierung anstelle von manchmal kryptischen Linkerfehlern.

Edit: Dies ist überhaupt nicht der Weg, um eine Variable "privat" zu machen. Sie müssen eine statische Variable verwenden, um sie "privat" zu machen. Siehe R Sahu's answer

+0

Sobald wir stackoverflow.h in stackoverflow.c. Der Compiler wird das ganze Ding in stackoverflow.c kopieren, oder? warum sollte es dann extern sein?Entschuldigung, wenn meine Frage dumm ist –

+0

Ja, Sie haben Recht, Bhavith C Acharya. Es zeigt auf meine Antwort richtig? – shafeeq

+0

Entschuldigung, liebe @ user3302647 Ich habe meine Antwort nicht bekommen. Meine Frage ist es notwendig, 'extern int my_var' in stackoverflow.h –

1

die Stelle besser globalen Variable in c-Programm

In Quelldatei zu erklären.

Wenn es nicht in anderen Dateien verwendet wird, dann verwenden static

+0

@ user332647 'statische' Variable in * .c oder * .h? –

+0

fügen Sie es in * .c Datei – shafeeq

0

Im Allgemeinen, was Sie tun können, ist die Variable in einer Quelldatei definieren, wie int g_foo;, dann diesen globale mit extern in anderen Dateien verweisen, wie extern int g_foo; do_sth(g_foo);. Sie könnten die Deklaration extern int g_foo; in eine Header-Datei einfügen und diese in andere Quelldateien einbeziehen. Es wird nicht empfohlen, Definitionen von Daten in Headerdateien zu definieren.

1

Wenn Sie die globalen Variablen in mehreren C-Dateien verwenden möchten, ist es besser, sie in H-Dateien zu deklarieren. Wenn Sie jedoch die Variablen wie private Mitgliedsdaten von Klassen in C++ beibehalten möchten, ist es besser, den Zugriff auf die globalen Daten über Funktionen bereitzustellen.

Statt

extern int foo; 

Verwenden

int getFoo(); 
void setFoo(int); 

Diese Art von ahmt die private Zugriffsbezeichner für Membervariablen von Klassen.

+0

@ R Sahu. Angenommen, ich habe in meinem Header test.h eine Variable 'extern int a 'deklariert und den Wert von' a' in test.c geändert. und den gleichen Header, den ich in test2.c eingeschlossen habe, und wenn ich versuche, 'a' in test2.c zu verwenden, wird mein' a' mit modifiziertem Wert oder frischem 'a' gespeichert. –

+0

Ja, natürlich. –

0

Wenn Sie es globale (externe Bindung) sein, können Sie es in .h Datei setzen sollte. Und das ist einer der besten Praxis, denke ich:

public_header.h

#ifdef YOUR_SOURCE 
#define EXTERN 
#else 
#define EXTERN extern 
#endif 

EXTERN int global_var; 

your_source.c

//your source makes definition for global_var 
#define YOUR_SOURCE 
#include <public_header.h> 

other_source.c

#include <public_header.h> //other sources make declaration for global_var 

Wenn Sie möchten, dass es private (interne Verknüpfung) ist, ist die beste Lösung, denke ich, nur die Definition von es richtig in Ihrer Quelldatei statt Header-Datei zu verhindern, dass die Header-Datei von einer anderen Quelle und dann enthalten ist verwirren.

your_souce.c

static int private_var; 
+0

warum sollte es in source.c statisch sein, warum kann nicht nicht statisch sein, gibt es einen Grund? . Liegt es daran, es lokal für diese Datei zu machen? –

+0

ja, wie ich erwähne, wenn Sie wollen, dass es privat ist (kann nicht aus anderen Quellen Datei gesehen werden), so muss es gehen mit 'static' – Nik

1

Sie nicht globale nicht konstante Variablen überall platzieren sollte. Global wie in deklariert mit extern und verfügbar für Ihr ganzes Projekt. Die Notwendigkeit, dies zu tun immer stammt aus schlechten Programm-Design, Zeitraum. Dies gilt sowohl für C als auch für C++.

Die Ausnahme ist const Variablen, die perfekt sind, um mehrere Dateien zu teilen.

Wenn Sie Dateibereich Variablen benötigen, sollten sie in der .c-Datei und immer als static deklariert werden. Verwechseln Sie diese nicht mit "Globalen", da sie sich lokal in der Übersetzungseinheit befinden, in der sie deklariert sind. More info about how static file scope variables can make sense.

beachten Sie auch die C-Standard Zukunft Sprachrichtungen:

eine Kennung mit interner Bindung an Dateigültigkeitsbereich deklarieren, ohne die statischen Speicherklassen-Bezeichner eine obsolescent Funktion.

Also, wenn Sie nicht verwenden static Ihr Code möglicherweise nicht in der nächsten Version des C-Standard kompilieren.

+0

OMG nette Erklärung –

Verwandte Themen