Was ist der Vorteil, wenn ich eine Funktion so definiere?

Gast #2652727
Was ist der Vorteil, wenn ich die Funktion so definiere und nicht wie 
gewohnt? Speicherplatz? Übersichtlichkeit?


#define PIN_SET_AS_PIO_OUTPUT(pin, pio) do { 
\
        Pio *pio_ptr; 
\
        if (PIO_A == pio) 
\
        { 
\
            pio_ptr = PIOA; 
\
        } 
\
        else if(PIO_B == pio) 
\
        { 
\
            pio_ptr = PIOB;                                      \
        } 
\
        else 
\
        { 
\
            pio_ptr = PIOC; 
\
        } 
\
        /* Bit corresponding to pin is set in output enable register. */ 
\
        pio_ptr->PIO_OER = pin; 
\
        /* PIO control is enabled on the specified pin. */ 
\
        pio_ptr->PIO_PER = pin; 
\
    } while (0);
Gast
Das du dir jede Menge Ärger einhandeln kannst, ohne zu wissen warum.

Du definierst so keine Funktion, sondern ein Makro. Also eine reine 
Textersetzung.

Ich würde sowas nur für Konstanten nutzen.
amateur schrieb:
> Was ist der Vorteil, wenn ich die Funktion so definiere und nicht wie
> gewohnt? Speicherplatz? Übersichtlichkeit?

Also, ich finde das Quatsch!
Wenn die Funktion nur einmal verwendet wird, könnte man sich dadurch den 
Code für den Aufruf sparen. Aber das erkennt der Compiler, glaube ich, 
auch selbst (inline-Funktion).
sebastian schrieb:
> Manche Sachen (z.B. Ports) kann man einer normalen Funktion nicht so
> einfach als Parameter übergeben. Vielleicht ist das hier der Fall.

Wenn du dir den Makrotext genauer ansiehst, siehst du, das eben genau 
dieser Fall hier nicht vorliegt. Durch dieses Makro hat man keinen 
Vorteil gegenüber einer inline Funktion. Aber dafür einige gravierende 
Nachteile.
Vorteil: Bessere Laufzeit-Performanz, da keine Sprungbefehle benoetigt 
werden.

Nachteile:
- Braucht mehr Programm-Speicher, da fuer jede Macro-Expansion eine 
Kopie der Funktion entsteht.
- Debugging wird nicht gut unterstuetzt (die ganze Funktion wird "in 
einer Zeile" ausgefuehrt)
- Compiler-Fehlermeldungen oft kryptisch

Fazit: Sowas hat man frueher mal gebraucht, als Compiler das inlining 
noch nicht so gut unterstuetzt haben. Heute sollte man sowas - ausser in 
ganz speziellen Faellen - besser vermeiden.

ZigZeg
Kai S. schrieb:
> Vorteil: Bessere Laufzeit-Performanz, da keine Sprungbefehle benoetigt
> werden.

wir gehen schon davon aus, dass der Programmierer so intelligent ist, 
dem Compiler das inlinen zu ermöglichen.

> Nachteile:
> - Braucht mehr Programm-Speicher, da fuer jede Macro-Expansion eine
> Kopie der Funktion entsteht.
> - Debugging wird nicht gut unterstuetzt (die ganze Funktion wird "in
> einer Zeile" ausgefuehrt)
> - Compiler-Fehlermeldungen oft kryptisch

Den Hauptnachteil hast du vergessen
Verwende das Makro so

  PIN_SET_AS_PIO_OUTPUT( i++, PIO_A );

und erleb dein blaues Wunder. Das ist ein echtes Problem, dagegen sind 
die anderen 3 maximal Schönheitsfehler.
Matthias Lipinsky schrieb:
> Das du dir jede Menge Ärger einhandeln kannst, ohne zu wissen warum.
>
> Du definierst so keine Funktion, sondern ein Makro. Also eine reine
> Textersetzung.
>
> Ich würde sowas nur für Konstanten nutzen.

Ganz genau dafür ist es auch da. Und für nichts anderes. Schon garnicht 
für oberes Codebeispiel. Sowas lagert man wenn dann in einer Funktion 
aus.

#define ist eine TEXTERSETZUNG.

Verwendung z.B. pi:
1
#define pi 3,14159265
2

3
main(){
4

5
kreisflaeche = 2 * pi * r
6

7
}

ist für den Compiler genau das gleiche wie:
1
main(){
2

3
kreisflaeche = 2 * 3,14159265 * r
4

5
}

Speichertechnisch kein Vorteil, nur Übersichtlichkeit, Derivat aus ASM

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.