globale typedef struct function
-
Hallo,
gibt es eine Möglichkeit in einem header eine globale typedef struct anzulegen, wo ich von mehreren Dateien zugriff haben kann?
header
typedef struct
{
int number;
}mynumber;programm:
mynumber.number = 20
programm2:
Wie kann zufriff auf die variable haben.
Vielen Dank
-
1. Ja, es ist möglich solch einen typedef zu machen. Und zwar genau so, wie du es getan hast.
2. Wozu typedef? Wir sind hier schließlich nicht in C, wo das struct zum Namen des Datentyps gehört.struct mynumber { ... };
macht exakt das gleiche.
3. Der Grund, warum das was du tust, nicht funktioniert ist, dass du nicht verstanden hast, was ein typedef ist. Oder eine Definition. Oder beides. Jedenfalls geht ja auch nicht:typedef int myint; myint = 1;
da das bloß eine andere Schreibweise ist für
int = 1;
Was einfach nur Unsinn ist, wie du sicherlich siehst.
Du musst eine Variable deklarieren, um sie benutzen zu können. Außerdem muss sie irgendwo (und zwar genau an einer Stelle im Programm) definiert sein. Die Definition einer Variablen sieht so aus (kennst du sicherlich schon):
int foo; // Oder mit dem typedef von oben: myint bar;
Wenn du eine Variable nur deklarieren möchtest, dann geht das mit dem Schlüsselwort extern:
extern int foo;
Das kann dann auch in einem Header stehen und macht überall wo der Header benutzt wird die globale int-Variable foo bekannt (die aber, wie schon gesagt, noch irgendwo definiert sein muss).
Globale Variablen gelten als sehr schlechter Stil und sind sehr anfällig für viele schwer zu findende und ärgerliche Fehler. Benutze sie nicht! Es gibt fast immer viel bessere Wege
-
Danke erst mal für die Antwort.
Ich habe irgendwie immer noch einen Fehler drin!
global.h
extern int variable;
global.cpp
int variable = 1;
readfile.cpp
#include "global.h"
new_var = variable
Ich bekomme als Fehler:
error LNK2001: unresolved external symbol "int variable"
-
"typedef struct" ist ein C-ism. In C++ muss man solche Verränkungen nicht machen.
Globale Variablen sind eher Pfui!
Nichts destro trotz...
header.hpp
#ifndef HEADER_HPP #define HEADER_HPP struct number // <-- hier wird der Typ number DEFINiert { int value; }; extern number mynumber; // <-- Ihh, eine globale Variable // wird hier DEKLARiert #endif
Die beiden Dinge könnte man auch kombinieren (
extern struct number {...} mynumber;
), wenn man das unbedingt will.tu1def.cpp
#include "deinheader.hpp" number mynumber = { // <-- hier wird mynumber DEFINiert 20 };
tu2use.cpp
#include <iostream> #include "deinheader.hpp" int main() { using namespace std; cout << mynumber.value << endl; // <-- hier wird's nur benutzt return 0; }
Aufgepasst: ODR (one-definition-rule) in 'nem schlauen C++ Buch nachlesen.
Und vergiss die Code-Tags bitte nicht. Das sieht einfach viel besser aus mit mono-space font, syntax highlighting und formatierung.
-
Wo ist variable definiert?
Hier nochmal SeppJs Warnung:
Globale Variablen gelten als sehr schlechter Stil und sind sehr anfällig für viele schwer zu findende und ärgerliche Fehler. Benutze sie nicht! Es gibt fast immer viel bessere Wege
-
campionissimo schrieb:
Danke erst mal für die Antwort.
Ich habe irgendwie immer noch einen Fehler drin!
global.h
extern int variable;
global.cpp
int variable = 1;
readfile.cpp
#include "global.h"
new_var = variable
Ich bekomme als Fehler:
error LNK2001: unresolved external symbol "int variable"
Das ist prinzipiell richtig so. Du linkst jedoch der Fehlermeldung nach die beiden Dateien (oder genauer: den aus beiden Dateien erzeugten Code) nicht richtig zusammen.