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


von Dennis (Gast)


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

von Floh (Gast)


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.

von Stefan E. (sternst)


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.

von Guru (Gast)


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.

von Johann L. (gjlayde) Benutzerseite


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:
1
#ifndef DEBUG_H
2
#define DEBUG_H
3
4
extern void debug_printf (char * format, ...);
5
6
#endif /* DEGUG_H */

In der C-Datei geht dann sowas wie
1
#include "debug.h"
2
3
...
4
{
5
    ....
6
#ifdef DEBUG_H
7
    debug_printf ("Hallo %d\n", 123);
8
#endif /* DEBUG_H */
9
    ....
10
}

Es geht auch so, dann muss man nicht zig #ifdefs in die Quelle machen:
1
#include "debug.h"
2
3
#ifdef DEBUG_H
4
#define DEBUG_PRINTF(y,z...)   debug_printf (y , ##z)
5
#else
6
#define DEBUG_PRINTF(...) (void) 0
7
#endif /* debug.h */
8
9
...
10
{
11
    ...
12
    DEBUG_PRINTF ("Hallo %d\n", 123);
13
    ...
14
}

oder, wobei DEBUG zB aus dem Makefile, also im Endeffekt aus der 
gcc-Kommandozeile per -DDEBUG=1, kommt:
1
#if DEBUG /* oder #ifdef */
2
#include "debug.h"
3
#else
4
#define debug_printf(...) (void) 0
5
#endif /* DEBUG */
6
7
...
8
{
9
    ...
10
    debug_printf ("Hallo %d\n", 123);
11
    ...
12
}

von Dennis (Gast)


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!

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.