Forum: PC-Programmierung #define-Anweisung in c/c++


von Pappnase (Gast)


Lesenswert?

Hab mal eine Frage: wenn ich in einem C-Programm viele 
#define-Anweisungen mache, verbrauchen diese dann auch Speicherplatz 
oder nur dann an der einen Stelle, wo das Dingen benutzt wurde? 
Angenommen, ich mach mir eine Datei mit Mehrwertsteuer-Defines für 
verschiedene Länder

#define mwst_brd 19
#define mwst_belg 23
...


und wenn ich dann im Quellcode nur eines von diesen verwende, wird dann 
im compilierten Programm nur der eine benutzt? oder werden die anderen 
"defines" auch vorratshalber mit im compilierten Programm geschrieben?

Wenn ich eine Headerdatei hab und habe eigene Funktionen dadrinnen, zB.

int mache_plus (int z1, z2)
{ return (z1+z2); }

mache_minus ()

mache_mal ()

mache_geteilt ()

....

und wenn ich im Hauptprogramm dann nur eine dieser Funktionen aufrufe, 
die anderen dann aber auch noch mit drinnen sind - verbrauchen die dann 
auch Speicher (compiliertes Programm) - oder nur genau die Funktionen, 
die auch "verwendet" werden?

von Rolf Magnus (Gast)


Lesenswert?

Pappnase schrieb:
> Hab mal eine Frage: wenn ich in einem C-Programm viele
> #define-Anweisungen mache, verbrauchen diese dann auch Speicherplatz
> oder nur dann an der einen Stelle, wo das Dingen benutzt wurde?

#define ist eine Präprozessor-Anweisung zur Text-Ersetzung. Das heißt, 
daß alle #defines weg sind, nachdem der Präprozessor des Compilers 
drübergelaufen ist.

> Angenommen, ich mach mir eine Datei mit Mehrwertsteuer-Defines für
> verschiedene Länder
>
> #define mwst_brd 19
> #define mwst_belg 23
> ...
>
>
> und wenn ich dann im Quellcode nur eines von diesen verwende, wird dann
> im compilierten Programm nur der eine benutzt? oder werden die anderen
> "defines" auch vorratshalber mit im compilierten Programm geschrieben?

Gar keins davon wird ins compilierte Programm geschrieben. Wenn du 
irgendwo mwst_brd benutzt, wird der Präprozessor dieses durch 19 
ersetzen. Es ist also im compilierten Programm nachher so, als hättest 
du an der Stelle direkt 19 hingeschrieben.

> Wenn ich eine Headerdatei hab und habe eigene Funktionen dadrinnen, zB.
>
> int mache_plus (int z1, z2)
> { return (z1+z2); }
>
> mache_minus ()
>
> mache_mal ()
>
> mache_geteilt ()
>
> ....
>
> und wenn ich im Hauptprogramm dann nur eine dieser Funktionen aufrufe,
> die anderen dann aber auch noch mit drinnen sind - verbrauchen die dann
> auch Speicher (compiliertes Programm) - oder nur genau die Funktionen,
> die auch "verwendet" werden?

Funktionen sind was völlig anderes als Makros. Technisch haben die 
beiden überhaupt nichts mit einander zu tun. Ob nicht benutzte 
Funktionen im Programm landen, hängt davon ab, welchen Compiler und 
Linker du verwendest und wie du sie verwendest. Auch kann es davon 
abhängen, ob die Funktionen static sind, da nur in diesem Fall der 
Compiler sicher sagen kann, ob die Funktion benutzt wird oder nicht.

von Pappnase (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Funktionen sind was völlig anderes als Makros. Technisch haben die
> beiden überhaupt nichts mit einander zu tun. Ob nicht benutzte
> Funktionen im Programm landen, hängt davon ab, welchen Compiler und
> Linker du verwendest und wie du sie verwendest. Auch kann es davon
> abhängen, ob die Funktionen static sind, da nur in diesem Fall der
> Compiler sicher sagen kann, ob die Funktion benutzt wird oder nicht.

Danke für die Antwort.

Ich habe gelesen, dass man Funktionen auch als #define-Anweisungen 
setzen kann, so ist es wohl in vielen der Headerdateien, auch habe ich 
mal ein Programm gesehen, dass einmal als "normaler" Quellcode 
geschrieben war eben mit void Name(void) und dann der Funktionskram, 
dann aber auch dieses gleiche Programm mit seinen Funktionen, die alle 
mit #define begannen.

Es ging mir dabei letztlich um die Frage, wenn man sich selber eine 
Datei erstellt und sich Funktionen darin abspeichert, die man sich 
selber gemacht hat und diese in anderen Programmen wiederbenutzen 
möchte, aber eben nicht alle - ob es dann sinnvoll ist, sich eigene 
Funktionsbibliotheken in Form von so #define-Anweisungen zu speichern? 
Es müsste ja doch auch z.B. bei der stdio.h so sein, da sind viele 
Funktionen drinnen, aber nur diejenigen, die man aufruft, werden mit in 
das Programm eincompiliert und der ganze Rest nicht - oder täusche ich 
mich da grade?

von Olaf B. (Gast)


Lesenswert?


von Pappnase (Gast)


Lesenswert?

Olaf B. schrieb:
> siehe hier:
>
> Beitrag "C: Funktion mit #define als Platzhalter"

danke für den Link, da steht ja einiges drinnen.

von Karl H. (kbuchegg)


Lesenswert?

Pappnase schrieb:

> Ich habe gelesen, dass man Funktionen auch als #define-Anweisungen
> setzen kann,

Solange du nicht genug Erfahrung hast, solltest du auch Funktionen 
schreiben, wenn du Funktion meinst.

Durch Ersetzen von Funktionen mit Makros kann man sich nämlich ganz 
schnell ganz gehörig selber ins Knie schiessen, wenn man nicht weiß was 
man tut.

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.