Utiliser du code C dans du code C++
Le problème de compatibilité provient du fait que C++ décore les noms de
fonctions -pour la surcharge des fonctions, les constructeurs/destructeurs, etc-
alors que le C ne les décore pas.
Créer un objet, en langage C :
// func.c
#include "func_c.h"
void say_hello()
{
printf("hello!\n");
}
int moyenne (int a, int b)
{
return (a+b)/2;
}
Son en-tête:
//func_c.h
#ifndef __CPP_USE_C_CPP_HDR__
#define __CPP_USE_C_CPP_HDR__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void say_hello();
int moyenne (int a, int b);
#endif
Le compiler sous forme d' objet, avec un compilateur C:
$ gcc -Wall -c func.c
C'est là que le C++ entre en jeu: copier le header C en ajoutant extern "C" aux fonctions:
//func_cpp.h
#ifndef __CPP_USE_C_CPP_HDR__
#define __CPP_USE_C_CPP_HDR__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern "C" void say_hello();
extern "C" int moyenne (int a, int b);
#endif
Cette notation fonctionne aussi:
extern "C" {
void say_hello();
int moyenne (int a, int b);
}
//main.cpp
#include <iostream>
#include "func_cpp.h"
int main ()
{
say_hello();
printf("moyenne: %d\n", moyenne (12,8));
return 0;
}
Compiler:
$ g++ -Wall -c main.cpp
$ g++ -Wall main.o func.o -o func
$ ./func
hello!
moyenne: 10