Hallo zusammen, ich hab schon etwas erfahrung in Assembler und möchte jetzt aber auf C umsteigen. Kann mir jemand mal fragen paar fragen beantworten: ich habe 2 C-Dateien und 2 dazu gehörende H-Datein. (FileA FileB) allgemeine Frage: ist es nun besser mit get/set-Methoden die Variablen dem jeweiligen anderen File zugängig zu machen, oder mit extern deklaration in der Header Datei? Mein extern gibt es ja nicht in C, aber der GCC Compiler unterstützt ja teils C++. falls ich nun in FileB eine while-schleife programmiert habe in der ich nun von FileA eine Variable als Bedingung nutze. Beispiel: FileB: #include"FileA.h" void FileB () { while(Variable_FileA) {....} } Falls ich nun mit "get/set" arbeiten würde, müsste ich m eine get-Methode in die while-Schleife mit reinpacken um so den aktuellen Wert der Variable zu erhalten? oder gibt es da noch einen besseren Programmierstil, z.B mit Zeigerübergabe?
"extern" gibt es auch in C. Getter und Setter brauchst du, wenn: => Module von verschiedenen Entwicklern entwickelt werden => Module eine gewisse Komplexität überschreiten => nicht für Bastelprojekte mit 500 Zeilen Code über 3 Dateien Auf kleinen Controllern ist es auch eine Performance-/Speicherfrage, ob man sich den Overhead gönnt. Zur Schleife: while (VariableA) {...} Ein getter wäre sinnfrei, besser wäre dann etwas wie: while (FileA_getSomeState() == SOME_SPECIAL_STATE) {...}
Mit Setter/Getter arbeitet man eher im oo-Umfeld wie in Java. Die Kapselung bedingt einen gewissen Overhead, den man in C nicht immer haben will. In C wird extern natürlich unterstützt, am einfachsten ist also
1 | extern int var_a; |
2 | // Ende des Headers von Modul A
|
3 | |
4 | void foo_b(void) |
5 | {
|
6 | a = 1; |
7 | }
|
alernativ kann man das Zeug in Strukturen sammeln:
1 | typedef struct |
2 | {
|
3 | int var1; |
4 | ...
|
5 | } modula_t; |
6 | |
7 | extern modula_t a; |
8 | // Ende des Headers von Modul A
|
9 | |
10 | // Indirekter Zugriff
|
11 | void foo_b2 (modula_t * pa) |
12 | {
|
13 | pa->var1 = 1; |
14 | }
|
15 | |
16 | // Direkter Zugriff
|
17 | void foo_b3 () |
18 | {
|
19 | a.var1 = 1; |
20 | }
|
Wenn Getter und Setter immer nur triviale Sachen machen, dann verschleiert das mehr, als es klar macht. Wenn man Kapselung also nicht braucht und erer auf kleinen, flotten Code scharf ist, würd ich drauf verzichten. Wenn ein Setter aber komplexere Sachen machen muss wie zB ein Dateizugruff oder ein Getter ne Kommunikation um an das Datum zu kommen, geht das schlecht mit einem Zugriff auf ne Variable. Johann
Johann L. wrote:
1 | > extern int var_a; |
2 | > // Ende des Headers von Modul A |
3 | >
|
4 | > void foo_b(void) |
5 | > { |
6 | > a = 1; |
7 | > } |
Muss natürlich heißen
1 | var_a = 1; |
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.