今頃になってVC++の extern "C" を知り、浦島次郎?

|

むかし昔、オブジェクト指向の勢い華やかし頃、良く分からないのに(世間的に?)多重定義だぁ、上書きだぁ、多重継承だぁ、再利用だぁ、との騒がしさに嫌気が差して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"));
}

/*---------------------------------------------------------------------------*/