www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Über Präprozessoranweisung auf Funktionsprototyp abfragen


Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen,

gibt es eine Möglichkeit, über eine Präprozessoranweisung (wie z.B. 
#ifdef)
abzufragen, ob für eine Funktion der Funktionsprototyp existiert?

Folgendes Problem:

Ich habe eine h-Datei in der es einen Funktionsaufruf gibt. Diesen 
Aufruf möchte ich aber nur machen, wenn in der c-Datei, in der die 
Header-Datei definiert wurde, auch der Funktionsprototyp existiert. 
Ansonsten soll der Funktinsaufruf nicht compiliert werden.

Geht sowas?!

Grüße

Dennis

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dennis schrieb:
> Ich habe eine h-Datei in der es einen Funktionsaufruf gibt.

Allein das klingt schon komisch. In eine Header gehört kein Code, 
sondern nur Definitionen.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dennis schrieb:
> gibt es eine Möglichkeit, über eine Präprozessoranweisung (wie z.B.
> #ifdef)
> abzufragen, ob für eine Funktion der Funktionsprototyp existiert?

Nein.

Dennis schrieb:
> Ich habe eine h-Datei in der es einen Funktionsaufruf gibt. Diesen
> Aufruf möchte ich aber nur machen, wenn in der c-Datei, in der die
> Header-Datei definiert wurde, auch der Funktionsprototyp existiert.
> Ansonsten soll der Funktinsaufruf nicht compiliert werden.

Hä? Das klingt ja ziemlich konfus. Zeig mal den Code dazu. Mal sehen, ob 
das wirklich so verquer ist, oder nur deine Beschreibung dazu.

Autor: Guru (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist ausführlich in den gängigen C-Büchern erklärt.

1. Der Preprozessor hat nichts mit der Sprache C zu tun. Kann also auch 
nicht auf den Parser-Baum zugreifen und testen ob eine 
Funktionsdefinition vorliegt.
2. Header-Dateien können nicht "definiert". Eine solche "Operation" auf 
Header-Dateien gibt es nicht.
3. In H-Dateien soll es keine Funktionsaufrufe geben.


Was Du vermutlich erreichen willst, geht schon, aber Du solltest erstmal 
die Begriffe und deren Anwendung, die Preprozessorfunktion und 
C-Dekklaration und C-Definition lernen. Dabei stösst Du dann zwangsweise 
auf die Lösung Deines Problems.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dennis schrieb:
> Guten Morgen,
>
> gibt es eine Möglichkeit, über eine Präprozessoranweisung (wie z.B.
> #ifdef)
> abzufragen, ob für eine Funktion der Funktionsprototyp existiert?
>
> Folgendes Problem:
>
> Ich habe eine h-Datei in der es einen Funktionsaufruf gibt. Diesen
> Aufruf möchte ich aber nur machen, wenn in der c-Datei, in der die
> Header-Datei definiert wurde, auch der Funktionsprototyp existiert.
> Ansonsten soll der Funktinsaufruf nicht compiliert werden.
>
> Geht sowas?!

Mal geraten: Du meinst sowas wie

debug.h:
#ifndef DEBUG_H
#define DEBUG_H

extern void debug_printf (char * format, ...);

#endif /* DEGUG_H */

In der C-Datei geht dann sowas wie
#include "debug.h"

...
{
    ....
#ifdef DEBUG_H
    debug_printf ("Hallo %d\n", 123);
#endif /* DEBUG_H */
    ....
}

Es geht auch so, dann muss man nicht zig #ifdefs in die Quelle machen:
#include "debug.h"

#ifdef DEBUG_H
#define DEBUG_PRINTF(y,z...)   debug_printf (y , ##z)
#else
#define DEBUG_PRINTF(...) (void) 0
#endif /* debug.h */

...
{
    ...
    DEBUG_PRINTF ("Hallo %d\n", 123);
    ...
}

oder, wobei DEBUG zB aus dem Makefile, also im Endeffekt aus der 
gcc-Kommandozeile per -DDEBUG=1, kommt:
#if DEBUG /* oder #ifdef */
#include "debug.h"
#else
#define debug_printf(...) (void) 0
#endif /* DEBUG */

...
{
    ...
    debug_printf ("Hallo %d\n", 123);
    ...
}

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@GURU:
okay, verstanden und geändert. Der Funktionsaufruf ist nun in einer 
externen C-Datei, in der auch der andere Code liegt, den ich nur unter 
bestimmten Umständen benötige.

@Johann L: Ja, sowas meinte ich. Und das habe ich auch so gemacht. Ich 
mache eine Konstantendefinition und der Präprozessor fragt vor dem 
Funktionsaufruf nun auf diese Konstante ab. Ist sie definiert, wird der 
Sprung compiliert. ansonsten wird die Stelle ausgelassen.

Vielen Dank Euch beiden! Das hat mir sehr geholfen!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.