globale Variablen: Gültigkeitsproblem!
-
Hallo,
Hab da ein kleines, dummes Problem und zwar habe ich in einer header.h in etwa folgendes stehen:
int x;
int y;
int z;Desweiteren habe ich nun eine Funktion namens void x(); in der die variablen x und y und z gebraucht werden.
#include "header.h"
void x()
{
...
}In der main() will ich nun die x() aufrufen.
main()
{
..
void x();
..
}Wieso sagt mir dann aber der compiler, das x, y und z "undeclared" sind?!
-
- erster Fehler
du kannst nicht eine Funktion un eine Variable mit demselben Namen haben
- zweiter Fehler
main() { .. void x(); /* Das void hier ist unzulässig */ .. }
-
Das zweite ist kein Fehler, sondern eine Funktionsdeklaration. Ob die an der Stelle beabsichtigt ist, sei mal dahingestellt.
Abgesehen davon haben Variablen-Definitionen in Headern normalerweise nichts verloren.
-
Bashar schrieb:
Das zweite ist kein Fehler, sondern eine Funktionsdeklaration. Ob die an der Stelle beabsichtigt ist, sei mal dahingestellt.
Das mag gemaß dem Standard an dieser Stelle zulässig sein, aber hier ist eher der Aufruf der Funktion gemeint und somit ist dies falsch
In der main() will ich nun die x() aufrufen.
Bashar schrieb:
Abgesehen davon haben Variablen-Definitionen in Headern normalerweise nichts verloren.
Sehe ich anders
in vardef.h#ifdef vardeklare
int a=33;
#else
extern int a;
#endifIst glaube eine sehr sinnvolles Produkt um globale Variablen in einem Projekt zu verwalten.
In genau einem File wird eine #define vardeklare eingefügt in allen anderen nicht.Natürlich soll man soweit es geht ohne globale Variablen auskommen, aber ohne gehts auch nicht.
-
Machst du das bei Funktionen auch so? Wenn du das mal in professionellem Code siehst, sag bescheid. Bis dahin tu ich die Definitionen in ein c-File.
-
Danke für die Blumen
Was stört dich daran?
-
@PAD
In den Header gehört einfach nur extern int a (also die Deklaration)
Die Definition (int a = 33) gehört in die zugehörige Quellcodedatei des Headers.Beispiel:
zahl.hextern int a;
zahl.c
#ifdef VAR33 int a = 33; #else int a = 0; #endif
main.c
#include "zahl.h" int main(void) { printf("%d", a); return(0); }
Wenn sich Fehler eingeschlichen haben (vielleicht fehlende externs
), bitte melden.
-
Mit deinem "ifdef var33" machst du etwas anderes als ich mit meinem "#ifdef vardeclare"
du weist der variablen zwei unterschiedliche Startwerte zu, während ich mit dem vardeclare
unterscheide ob ich die extern Definition oder die Variablendefinition benutze.Den Fall den du mit var33 schilderst, ist leider technisch möglich aber aus meiner Sicht sehr schlechter Stil.
Aber an guten Argumenten warum "mein" Verfahren schlecht sein soll wäre ich interessiert.
Den Hauptvorteil den ich sehe das die Arbeit mit nötigen globalen Variablen an einer Stelle
zusammengefasst ist. Falls eine Variable hinzu oder wegkommt ist die Änderung auf eine und nicht auf zwei Stellen konmzentriert.
-
PAD schrieb:
Den Hauptvorteil den ich sehe das die Arbeit mit nötigen globalen Variablen an einer Stelle
zusammengefasst ist. Falls eine Variable hinzu oder wegkommt ist die Änderung auf eine und nicht auf zwei Stellen konmzentriert.Du hast die Stelle vergessen, an der du das zusätzliche Makro definieren musst.
-
versteh ich nicht.
ich hab in dem c-file indem die main funktion ist immer ein #define vardekalre stehen und in allen andern c-files nicht. wenn jetzt eine Variable hinzu oder wegkommt passiert dies nur in diesem einen Headerfile.
Diese Konstrukt geht um alle nötigen globalen Defintionen auf einemal und nicht für jede einzeln.#ifdef vardeklare ..... int a=33; int b=33; int c=33; ..... #else extern int a; extern int b; extern int c; ..... #endif
-
Achso, du bindest immer alle Header in das Hauptprogramm ein? Sag das doch. Ich bevorzuge lockerere Strukturen.
-
Nicht alle Header, aber den Header der diese globlen Definitionen beinhaltet ja.
Womit du allerdings recht hast, das ich dadurch mehr Header in dieses eine File einbinden muß
als die zwingend notwendigen für dieses File.Stop dies betrifft nicht nur das File mit dem main sondern alle die, in die dieses Headerfile eingebunden wird.
Das habe ich bisher noch nicht so gemerkt.
Allerdings habe ich in diesem File alle Programm globalen Strukturdefinitionen und typedefs, und die werden in den meisten anderen C-files auch gebraucht.
Eigenständige Module sind schwerpunktmäßig als dll´s realisiert und der Zugriff auf globale in diesen Modulen erfolgt typischerweise über Funktionen, so daß ich von nirgendwo auf eine die globale eines Modul zugreifen muss.@ Bashar: Aber dein letztrt Text hat ein paar interessante Anregungen auch wenn er kurz ist