Forum: Compiler & IDEs C-Anfängerfrage


von Marc (Gast)


Lesenswert?

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?

von Alex (Gast)


Lesenswert?

"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) {...}

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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

von Marc (Gast)


Lesenswert?

Das ging ja schnell, danke für die antwort.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.