Bonjour,
J'ai créé une fonction en C que j'aimerais utiliser dans une IHM en C++. Comment puis-je appeller cette fonction C dans mon code C++ ?
Bonjour,
J'ai créé une fonction en C que j'aimerais utiliser dans une IHM en C++. Comment puis-je appeller cette fonction C dans mon code C++ ?
J'ai cru comprendre qu'il fallait créer une librairie static pour ma fonction C et l'appeller dans les .h du C++. Cependant le peu d'explications que j'ai trouvé n'est pas très clair .
Y'a-t-il un tuto dédié à cela ? Sinon quelqu'un pourrait-il m'expliquer la demarche ?
Merci
Entourre ton code C d'une extern "C" et utilise-le directement:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 #ifdef __cplusplus extern "C" { #endif void MaFonctionC( void ); #ifdef __cplusplus } #endif
Alors attends, je mets
direct dans le fichier cpp c'est ça ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #ifdef __cplusplus extern "C" { #endif void MaFonctionC( void ) { //code } #ifdef __cplusplus } #endif
si oui, je l'ai fait, et mon problème reste le même, c'est a dire qu'en C j'utilise une fonction swab qui prends n'importe quoi en parametre, en C++ il n'accepte que des char*. Or ici quand je compile, il considere la version c++ de swab alors que je l'ai entouré d'une extern C .
Donc soit j'ai fais une mauvaise manip, soit je dois faire autrement.
L'idée d'un librairie partagée serait-elle envisageable ?
Non pas comme ça.
Faut mettre ça dans ton .h de ton .c. Ensuite tu peux inclure ton .h dans ton .cpp et ça devrait rouler. Regarde dans <stdio.h> c'est fait comme ça par exemple.
Ca c'est pour la compilation.
Pour l'édition de liens, tu peux opter pour une lib partagée ou pas. C'est un détail.
Pour swab je comprends pas trop, c'est pas un problème de cast plutôt ? Le C++ est un peu moins permissif.
Donne le code qui pose problème.
Bon voici le code de ma fonction C qui marche très bien.
Tu vois que dans le swab je passe des short. En C++ il veut que des char*. Le cast marche pas parce le swab avec les short inverse les bits, le swab avec le char* inverse les octets ou un truc dans le genre.
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74 #include <stdio.h> #include <stdlib.h> #include <time.h> void decouper(char * nom_fic) { FILE *pin; FILE *pout2; FILE *pout3; FILE *pout4; FILE *pout5; char ligne[500]; short big_s; short lit_s; int i; int j; pin = fopen(nom_fic, "rb"); pout2 = fopen("./Data/porte2.dat", "w"); pout3 = fopen("./Data/porte3.dat", "w"); pout4 = fopen("./Data/porte4.dat", "w"); pout5 = fopen("./Data/porte5.dat", "w"); for (i = 0; i < 1160; i++) //on fait pas sur 1h mais sur 58 min -> 58*60/3 = 1160 { fgets(ligne, 500, pin); //on met l'entete en memoire for (j = 0; j < 4096; j++) { //on saut le bloc de 4096 points correpondant a la premiere porte fread(&big_s, sizeof(short),1, pin); } //fprintf(pout2, "Seconde %d\n", 3 * i); for (j = 0; j < 4096; j++) { fread(&big_s, sizeof(short),1, pin); swab(&big_s, &lit_s, sizeof(short)); fprintf(pout2, "%d\n", lit_s); } //fprintf(pout3, "Seconde %d\n", 3 * i); for (j = 0; j < 4096; j++) { fread(&big_s, sizeof(short),1, pin); swab(&big_s, &lit_s, sizeof(short)); fprintf(pout3, "%d\n", lit_s); } //fprintf(pout4, "Seconde %d\n", 3 * i); for (j = 0; j < 4096; j++) { fread(&big_s, sizeof(short),1, pin); swab(&big_s, &lit_s, sizeof(short)); fprintf(pout4, "%d\n", lit_s); } //fprintf(pout5, "Seconde %d\n", 3 * i); for (j = 0; j < 4096; j++) { fread(&big_s, sizeof(short),1, pin); swab(&big_s, &lit_s, sizeof(short)); fprintf(pout5, "%d\n", lit_s); } } fclose(pin); fclose(pout2); fclose(pout3); fclose(pout4); fclose(pout5); }
Bon j'ai fais ce que tu m'as dis, j'ai mis ça ds le .h du .c, compilation ok, execution ok.
Ensuite je l'ai inclus dans le cpp : #include<decoupage.h> ça compile
par contre si j'appelle la fonction decoupage, la ça compile plus, j'ai cette erreur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 error LNK2001: unresolved external symbol "void __cdecl decoupage(char *)" (?decoupage@@YAXPAD@Z) Debug/Test2.exe : fatal error LNK1120: 1 unresolved externals Error executing link.exe.
Oui il faut compiler et linker ton .c avec tes .cpp, comme si c'était plusieurs .c ou plusieurs .cpp.
Bonjour,
Ton code C est compatible C++ à première vue, tu peux l'utiliser directement, le C++ est prévu pour compiler du C.
Comme le dit Bjarne Strourtrup, le C++ est un sur-ensemble du C. Seule quelques syntaxes spécifique du C ne compilent pas en C++.
Le C++ par exemple oblige un cast explicite devant un malloc.
.oui mais je fais ça avec Visual C++ en fait. Donc j'ai inclu les fichiers .h et .c dans le projet visual. En fait je comprends pas bien ce que tu veux me direOui il faut compiler et linker ton .c avec tes .cpp, comme si c'était plusieurs .c ou plusieurs .cpp.
Oui ça compile, mais comme je le disais, la fonction swab en C prends en parametre ce que je veux, alors qu'on C++ elle ne prend que du char*. Un cast n'a pas réglé mon prb, il faut absolument qeu j'utilise la version C de la fonction swab, masi j''en ai besoin dans une petite interface en C++Envoyé par Caine
Je viens d'incorporer ton fichier sous VC++, il compile parfaitement.
Le C++ a été prévu par son créateur Bjarne Strourtrup pour compiler avec du C standard.
Il y a peu de code C qui ne compile pas en l'état avec un compilateur C++.
Les codes C non compatibles C++ sont souvent des version pré-Ansi du C comme la syntaxe K&K la plus vieille.
Ou depuis la dernière norme C, C99, pour le malloc par exemple.
Tu n'as pas besoin de changer ton fichier pour le compiler.
Cependant il est plus propre de faire comme l'a indiqué Aurelien dans un second temps.
[edit]
Donne nous le code de swab alors, ça aidera.
Oui il compile, mais si tu essaye d'utiliser la fonction decoupage("nom_du_fichier_a_decouper") il va te dire que swab peut pas transformer un short* en char* ou un truc dans le genre. Donc pour l'instant ce que j'ai essayé :Envoyé par Caine
copier coller du code de la fonction C dans le fichier C++, donc la erreur a la compilation car swab ne prend que des char*
inclure le fichier .C et .h dans le projet VC++ et la j'ai une erreur
de compilation et des warnig :
donc je veux bien savoir comment t'as fait pour compiler
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 warning C4133: 'function' : incompatible types - from 'short *' to 'char *' error LNK2001:unresolved external symbol "void __cdecl decoupage(char *)" (?decoupage@@YAXPAD@Z)
Ouai c'est ma fête aujourd'hui
Bon ça compile pas, j'ai ça comme erreur quand j'appelle ma fonction:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Test2Dlg.obj : error LNK2001: unresolved external symbol "void __cdecl decoupage(char *)" (?decoupage@@YAXPAD@Z) Debug/Test2.exe : fatal error LNK1120: 1 unresolved externals
OK j'ai compris l'erreur.
Tu as un problème car ton système utilise l'Unicode, or tu passes une chaine normale.
utilise _T("Tachaine") dans ton appel de fonction.
Au passage, il ne s'agit pas d'un problème de C/C++ mais de chaînes de caractères.
Vérifies tes options de compilation.
[edit]
Deuxième problème, sous VC, il faut inclure stdafx.h.
Rajoutes
AU début de ton code. Je pensais que tu connaissais, autant pour moi, c'est la seule modif que j'ai fait (avec mettre en commentaire les appels à Swab que je n'ai pas).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 #include "stdafx.h"
Bon l'histoire du stdafx.h j'ai fini par trouver, mais pour ce qui est du _T("Tachaine"), j'appelle ma fonction ainsi decoupage(_T("fichier.dat")); ?
Si oui, ça ne marche toujours pas et ça donne la même erreur
Je précise que ça compile, mais le problème se passe à l'execution
Je dirais plutot à l'édition des liens.
T'es sûr de ne pas avoir oublie le extern "C" ?
Je n'ai pas eu besoin des extern "C".
J'ai pris son code directement et il compile.
Tient, j'ai un trou de mémoire, car j'écris souvent du code C que je compile sans en C++.
Pourquoi les Extern "C" à la base?
Mets le code dans un fichier avec l'extenion .c, utilise-le depuis un fichier avec l'extension .cpp et tu vas découvrir l'utilité.
Y'a une histoire de name mangling, de convention d'appels, etc...
Sans name mangling la fonction s'appelle "decoupage", et avec le mangling C++ "?decoupage@@YAXPAD@Z", dans le cas de ce compilateur. La décoration de nom permet au compilo C++ de faire de la surcharge, de connaitre le type de paramètres de la fonction, etc...
OK, je me souviens maintenant.
Si on met le, code dans un fichier d'extension cpp, il n'est plus la peine d'utiliser 'extern "C"'.
C'est ce que je fait assez souvent, du mélange de code C et C++, mais toujours avec l'extension cpp.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager