むかし昔、オブジェクト指向の勢い華やかし頃、良く分からないのに(世間的に?)多重定義だぁ、上書きだぁ、多重継承だぁ、再利用だぁ、との騒がしさに嫌気が差してC++なんて知らねぇ、と決め込んでいた。
だけどこのコロナ禍、暇が有り過ぎてVC++を触ってみたら、C++からCが呼べない! CからC++が呼べない!!
調べてみたら、どうも、装飾名が邪魔をしているらしい。この名前マングリング、あろうことか、Cコンパイラ依存、ターゲットアーキテクチャ依存、他言語依存、然もVC++のバージョン依存らしい、何てこったい。
ただ、解決策も有った。VC++に「extern "C"」を追加し、呼出す機能を「C並み」にする事。
試しに、C ⇔ C++ 間でサブルーチンを呼び出すだけのサンプルを作ってみた。(DLL、自ら使った事も作った事も無いけど、その内に・・・)
お試し環境
WindowsXP 32bit Edition
Visual C++ 2008
/*------------------------------ お試し結果 -------------------------------*/
D:\vc2008\dllchk>testpp
CPRINT Message : C++ Called
C++PRINT Message : C Called
CPRINT Return from C++ : 100
C++PRINT Return from C : 10000
/*----------------------------------------------------------------------------*/
/*---- testc.c ---------------- お試しソース -----------------------------*/
#include <stdio.h>
extern int subpp(char *);
int subc(char *s)
{
printf("CPRINT Message : %s\n", s);
printf("CPRINT Return from C++ : %d\n", subpp("C Called"));
return(100 * 100);
}
/*---------------------------------------------------------------------------*/
/*---- testpp.cpp ---------------- お試しソース ---------------------------*/
#include <cstdio>
extern "C" int subc(char *);
extern "C" int subpp(char *s)
{
printf("C++PRINT Message : %s\n", s);
return(100);
}
void main(void)
{
printf("C++PRINT Return from C : %d\n", subc("C++ Called"));
}
/*---------------------------------------------------------------------------*/