Bonjour,
je voudrais savoir comme spécifier dans du code C++ au compilateur que la fonction est écrite en C.
merci
Version imprimable
Bonjour,
je voudrais savoir comme spécifier dans du code C++ au compilateur que la fonction est écrite en C.
merci
Salut,
une petite recherche dans la FAQ donne la réponse ici
penser à utiliser la :faq: :)
Tarrke
euh...
D'après ce que j'ai pu voir, ça ne spécifie pas que la fonction est écrite en C, mais qu'elle est a une interface (le nom interne, entre autres) de fonction C.
Mais il me semble bien que l'intérieur peut être en C++...
PS: Je viens de tester sous Visual 6:
La fonction est bien en c++, mais elle son nom interne sera en CCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 class CClasseTest { public: void printSelf(); }; void CClasseTest::printSelf() { if(this==NULL) puts("Je suis NULL"); else printf("J'ai l'adresse %08X\n", this); } #ifdef __cplusplus extern "C" { #endif void testExternC() { CClasseTest cctTest1; CClasseTest *pt_cctTest2 = NULL; pt_cctTest2->printSelf(); cctTest1.printSelf(); pt_cctTest2 = new CClasseTest; pt_cctTest2->printSelf(); delete pt_cctTest2; } #ifdef __cplusplus } #endif
( _testExternC au lieu de ?testExternC@@YAXXZ )
moi je comprends ça comme la réponse à la question ci-dessus. On peut utiliser des librairies écrites (et compilées) en C à partir du moment où l'on déclare ces fonctions comme étant en C.Citation:
Envoyé par La FAQ
Ceci di le code suivant compile en C++ mais n'est pas du C++, c'est du C.
Un compilo C++ (tel que g++) le prendra sans aucun problème. Il est donc possible de mettre du code C dans un code C++ pour le compiler, mais si l'on souhaite employé un code compilé en C dans un code C++ il faut le déclarer au compilateur. Ce qui rejoint ce que disait Médinoc sur les noms internes, le compilo doit avoir le bon nom pour rechercher la fonction dans la lib...Code:
1
2
3
4
5 int main() { printf("Hello World\n"); return 0; }
Tarrke
Bonjour,
extern "C" permet d'utiliser des fonctions écritent en C mais celle ci doivent être compilées dans un fichier objet à part grâce à un compilateur C, il faut donc faire :
fichier cpp :
Fichier d'en têteCode:
1
2
3
4
5
6
7
8
9
10
11
12
13 class CClasseTest { public: void printSelf(); }; void CClasseTest::printSelf() { if(this==NULL) puts("Je suis NULL"); else printf("J'ai l'adresse %08X\n", this); }
Code:
1
2
3
4
5
6
7
8
9 #ifdef __cplusplus extern "C" { #endif void testExternC(void) #ifdef __cplusplus } #endif
Fichier c :
Il faut bien sûr que le code du fichier .c soit du C :roll:Code:
1
2
3
4
5
6
7
8
9
10
11 void testExternC() { CClasseTest cctTest1; CClasseTest *pt_cctTest2 = NULL; pt_cctTest2->printSelf(); cctTest1.printSelf(); pt_cctTest2 = new CClasseTest; pt_cctTest2->printSelf(); delete pt_cctTest2; }
Euh...
J'ai peur que tu aies pris le problème à l'envers: Les deux fonctions sont en C++.
Mais TestExternC peut être appelée depuis un code source en C, bien qu'elle soit en C++ (car son interface est en C)
TestExternC peut également être appelée depuis un code source C++, car l'entête signale au compilateur C++ que TestExternC possède une interface en C.
Exemple:
Fichier d'en tête
Inclut dans un fichier C, le extern "C" est ignoré: Tout ce que voit le compilateur, ce sont deux déclarations de fonction C (impossible de déclarer une fonction C++).Code:
1
2
3
4
5
6
7
8
9
10 #ifdef __cplusplus extern "C" { #endif void testExternC1(void); void testExternC2(void); #ifdef __cplusplus } #endif
Inclut dans un fichier C++, le extern "C" signale au compilateur que les fonctions (C ou C++) sont déclarées en C ( le nom de la première sera _testExternC1 au lieu de ?testExternC1@@YAXXZ et la seconde, pareil).
Fichiers C et/ou C++ :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 #ifdef __cplusplus extern "C" { #endif void testExternC1() { CClasseTest cctTest1; CClasseTest *pt_cctTest2 = NULL; pt_cctTest2->printSelf(); cctTest1.printSelf(); pt_cctTest2 = new CClasseTest; pt_cctTest2->printSelf(); delete pt_cctTest2; } #ifdef __cplusplus } #endif
Pour un compilateur C, extern "C" sera ignoré: testExternC1 ne sera pas compilable (syntax error et cie) et testExternC2 sera tout simplement une fonction C compilé en C par le compilateur C.Code:
1
2
3
4
5
6
7
8
9
10 #ifdef __cplusplus extern "C" { #endif void testExternC2() { puts("bonjour"); } #ifdef __cplusplus } #endif
Pour un compilateur C++, extern "C" sera pris en compte, et le compilateur C++ compilera sans problème les deux fonctions mais leur donnera une interface C( Il appellera la première _testExternC1 au lieu de ?testExternC1@@YAXXZ et la seconde, pareil)
Dans les deux cas, testExternC2 pourra être appelée aussi bien depuis un fichier C que depuis un fichier C++. testExternC1 également, à supposer qu'elle ait été compilée.
Le code suivant:
passera sans problème aussi bien dans un compilateur C qu'un compilateur C++Code:
1
2
3
4
5
6
7 #include "fichier.h" int main(int argc, char *argv[], char *envp[]) { testExternC1(); testExternC2(); }