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