C++-Lib mit extern "C" und Header mit Templates

27/10/2014 - 08:30 von Heinz-Mario Frühbeis | Report spam
Hallo,

vor einiger Zeit habe ich mal gelesen, daß man bei extern "C"{} auch
darin entsprechende includes von z. Bsp. Headern einstellen soll.
Jetzt habe ich aber Templates in den Headern, die der Compiler anmeckert
wegen "nur" C.
Soweit auch ok...
Diesen Header brauche ich aber auch für C++-"Sachen" und habe quasi den
selben Header in die h-Datei der Lib includiert. Und siehe da..., der
Compiler meckert nicht mehr und selbst Funktionen mit Templates lassen
sich ordnungsgemàß ausführen.

Ich versuche mal ein Pseudo-Bsp.:

Version A:
-
LibA >
HeaderA.h // mit Template-Funktionen

libA.h >
class libA{
public:
libA();
};

libA.cpp >
#include "libA.h"

libA::libA(){
}

extern "C"{
#include "HeaderA.h" // Compiler meckert wegen Templates
}

Version B:
-
LibA >
HeaderA.h // mit Template-Funktionen

libA.h >
#include "HeaderA.h" // Nun LibA mit inkludierter HeaderA.h

class libA{
public:
libA();
};

libA.cpp >
#include "libA.h"

libA::libA(){
}

extern "C"{
#include "HeaderA.h"
// Compiler meckert _nicht_ _mehr_! Und es lassen sich auch alle
// Template-Funktionen von HeaderA.h ausführen
}

Ich meine es funktioniert, ja, aber...kann man das so lassen? Ist es
konform? Kommt da eventuell noch was anderes auf mich zu, was ich noch
nicht feststellen konnte? Oder kann ich es einfach so lassen?
Ich meine, ich schreibe meinetwegen auch seperate Header für C und C++,
aber wenn ich es wie in "Version B" lassen kann, "spare" ich es mir
natürlich...

Mit Gruß
Heinz-Mario Frühbeis
 

Lesen sie die antworten

#1 Heinz-Mario Frühbeis
27/10/2014 - 09:28 | Warnen spam
Am 27.10.2014 um 08:30 schrieb Heinz-Mario Frühbeis:
Hallo,

vor einiger Zeit habe ich mal gelesen, daß man bei extern "C"{} auch
darin entsprechende includes von z. Bsp. Headern einstellen soll.
Jetzt habe ich aber Templates in den Headern, die der Compiler anmeckert
wegen "nur" C.
Soweit auch ok...
Diesen Header brauche ich aber auch für C++-"Sachen" und habe quasi den
selben Header in die h-Datei der Lib includiert. Und siehe da..., der
Compiler meckert nicht mehr und selbst Funktionen mit Templates lassen
sich ordnungsgemàß ausführen.

Ich versuche mal ein Pseudo-Bsp.:

Version A:
-
LibA >
HeaderA.h // mit Template-Funktionen

libA.h >
class libA{
public:
libA();
};

libA.cpp >
#include "libA.h"

libA::libA(){
}

extern "C"{
#include "HeaderA.h" // Compiler meckert wegen Templates
}

Version B:
-
LibA >
HeaderA.h // mit Template-Funktionen

libA.h >
#include "HeaderA.h" // Nun LibA mit inkludierter HeaderA.h

class libA{
public:
libA();
};

libA.cpp >
#include "libA.h"

libA::libA(){
}

extern "C"{
#include "HeaderA.h"
// Compiler meckert _nicht_ _mehr_! Und es lassen sich auch alle
// Template-Funktionen von HeaderA.h ausführen
}

Ich meine es funktioniert, ja, aber...kann man das so lassen? Ist es
konform? Kommt da eventuell noch was anderes auf mich zu, was ich noch
nicht feststellen konnte? Oder kann ich es einfach so lassen?
Ich meine, ich schreibe meinetwegen auch seperate Header für C und C++,
aber wenn ich es wie in "Version B" lassen kann, "spare" ich es mir
natürlich...

Mit Gruß
Heinz-Mario Frühbeis



Gerade habe ich festgestellt, daß ich (wohl) gar keine Header
inkludieren kann ohne Compiler-Error.

LibA:

Version A:
cpp-Datei:

#include "ida.h"

IDA::IDA(){
}

#ifdef __cplusplus
extern "C"{

void __attribute__ ((constructor)) my_init(void){
}

void __attribute__ ((destructor)) my_fini(void){
}

}
#endif
// Alles ok

Version B:

HeaderA:
#include <iostream>
#include <string>

inline void Std_CoutA_C(std::string vExplain, int nOut
, int nOut1){
if(vExplain != ""){
std::cout<< vExplain <<" "<< nOut << " "<< nOut1 << "";
} else{
std::cout << nOut << " "<< nOut1 << "";
}
std::cout.flush();
}

cpp-Datei:

#include "ida.h"

IDA::IDA(){
}

#ifdef __cplusplus
extern "C"{
#include "HeaderA.h"

void __attribute__ ((constructor)) my_init(void){
//IDAFunk::Std_Cout("IDA EXTERN CONSTRUCT", "");
//Std_CoutA_C("test", 1, "test");
}

void __attribute__ ((destructor)) my_fini(void){
//IDAFunk::Std_Cout("IDA EXTERN DECONSTRUCT", "");
}

Std_CoutA_C("test", 10, 1);

}
#endif

//Hier, für Version B, kommen "ohne Ende" Fehler:

/usr/include/c++/4.8/bits/locale_facets.tcc:41: Fehler: template with C
linkage
template<typename _Facet>
^

/usr/include/c++/4.8/bits/memoryfwd.h:66: Fehler: template
specialization with C linkage
template<>
^
etc., etc. ...

Ich beziehe mich da u.a. auf :
<http://stackoverflow.com/questions/...n-work>

Ähnliche fragen