Header kann auf static zugreifen?
-
Aha, ich hätte nicht gedacht, daß der Praeprozessor so primitiv ist...aber nu gut.
Ich möchte jetzt die Funktionen, die ext.h beinhaltet durch C++ Code ersetzen.
Ich fürchte, ich kann C++ Code nicht einfach in die ext.h hineinschreiben, oder?Ich habe noch wenig Erfahrung mit C/C++. Wenn ich C++ Funktionen von C aus aufrufen möchte, muss ich (wie immer) Header & Lib (meinCPP.h, libmeinCPP.a) erstellen und dann einbinden, oder?
-
Willst du in C Funktionen aus einer C++ compilierten lib verwenden, solltest du EINE gemeinsame, d.h. in C UND C++ verwendbare Headerdatei verwenden.
Für den C++ Compilerlauf musst du die Funktionen mit 'extern "C"' kennzeichnen, also in etwa so/* ext.h */ #ifdef __cplusplus #define CAPI extern "C" #else #define CAPI #endif CAPI void func1(void); CAPI int func2(int); ...
Damit kompilierst du deine .a mit einem C++ Compiler
und bindest dann deine ext.h und deine ext.a in dein C-Projekt ein.
-
Würde das Bsp auch funktionieren, wenn in ext.h nur die Funktionsdeklaration stehe und in ext.c die eigentliche Funktion?
Bzw...
1.) koennte ext.c auf die statischen Variablen von prog.c zugreifen?
2.) koennte umgekehrt von prog.c aus auf die statische Funktion in ext.c zugegriffen werden?
-
Beidesmal nein, denn 'static' bezieht sich immer auf die jeweilige ÜE (Übersetzungseinheit). Jede ÜE hat ihre eigenen statischen Variablen und Funktionen.
-
Also funktioniert dieser "Trick" nur, wenn echter Code (dh. Funktionsrumpf und nicht nur die Deklaration) in die Header-Datei geschrieben wird.
Kann ich so einen Trick auch anwenden, wenn ich C++ Code in ext.h verwenden möchte?
-
Nicht bei einem C-Compiler.
-
Der liebe Herr Wutz hat mir ja schon eine Vorlage für ext.h gegeben, damit C++ func1() und func2() von C-Code aus aufgerufen werden können.
/* ext.h */ #ifdef __cplusplus #define CAPI extern "C" #else #define CAPI #endif CAPI void func1(void); CAPI int func2(int); ...
Könnte man hier nicht noch eine C-Funktion einfügen, die von C++ aus aufgerufen die statischen Variablen in C ändert?
Etwa so..
/* ext.h */ static changeStaticVars(){ i++: } #ifdef __cplusplus #define CAPI extern "C" #else #define CAPI #endif CAPI void func1(void); CAPI int func2(int); ...
-
Du scheinst immer noch nicht zu verstehen, was eine statische Variable ist.
Sobald du von einer anderen ÜE (also z.B. von einer test.cpp) diesen Header einbindest, wird eine eigene statische Variable benutzt.Warum benötigst du überhaupt diesen ganzen Kram? Vllt. solltest du mal besser dein eigentliches Problem hier schildern.
-
Warum ich das brauche?
Ich möchte die Kommunikationsschnittstelle eines bestehenden Projekts austauschen. Nun versuche ich möglichst sauber, dh. mit möglichst wenigen Eingriffen in den Code anzupassen.
Leider ist die neue Kommunikationsschnittstelle in C++ geschrieben, das ursprüngliche Programm aber in C.Hier nochmal das Problem als abstraktes Bsp. Vielleicht fällt ja jmd eine elegante Lösung ein.
// prog.c #include ext.h static RESULT res=ERR; static int free=0; static send(){ free=0; } static receive(){ free=1; setResult(); } RESULT getStatus(){ return res;
Wobei setResult durch einen Header eingefügt wird.
// ext.h static setResult(){ res=OK; }
Jetzt muss ich send() und receive() durch C++ Code ersetzen...nur die static Variablen sind mir im Weg.
.
-
Gut, ich habe mittlerweile eine saubere Lösung fuer meine C++ Funktionen gefunden.
Aber ich habe noch mal eine Frage zum Kompilieren.Wutz schrieb:
/* ext.h */ #ifdef __cplusplus #define CAPI extern "C" #else #define CAPI #endif CAPI void func1(void); CAPI int func2(int); ...
1.) muss der Prefix CAPI auch vor den Funktionen in ext.c stehen, oder nur in der Header?
2.) Ich habe zwei C++ Funktionen definiert. Für eine Funktion, die in proc.c von einer static Funktion aus aufgerufen wird, bekomme ich die Warnung ext.h:20:1: warning: function declaration isn’t a prototype.
Warum kommt die Warnung nicht bei der anderen Funktion, die von einer nicht-statischen Funktion aufgerufen wird?
Und wie bekomme ich die Warnung weg?
-
- in Header reicht aus
- die Warnung kann ich nicht nachvollziehen