Bonjour,
je voudrais savoir comme spécifier dans du code C++ au compilateur que la fonction est écrite en C.
merci
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![]()
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 C
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 )
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
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.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 : Sélectionner tout - Visualiser dans une fenêtre à part
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ête
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 } #endifPour 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 #include "fichier.h" int main(int argc, char *argv[], char *envp[]) { testExternC1(); testExternC2(); }
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Partager