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
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.
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.
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.
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 | }
|
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.