マングリング(extern “C”)

マングリングとは、関数のシグニチャ(名前と型)をラベルに埋め込むこと(C++で同名の関数を識別するため)。
で、こいつがCのソースをC++コンパイラに解釈させるときにネックとなる。
例:エラーの出るコード
test.h

extern void hoge(void);

test.cpp

#include 
#include "./test.h"
void hoge(void){
	printf("hoge!n");
}

main.c

#include "./test.h"
int main(void){
	hoge();
	return 0;
}

具体的な回避方法は以下。
ケース1:C++ソースで定義した関数をCソースから呼ぶ
例のtest.hを

#ifdef __cplusplus
extern "C" void hoge(void);
#else
extern void hoge(void);
#endif

に変更するか、
例のtest.cppを

#include 
extern ”C”{
#include ”test.h”
}
void hoge(void){
	printf("hoge!n");
}

とする。
ケース2:Cソースで定義した関数をC++ソースから呼ぶ
test.h

extern void hoge(void);

test.c

#include 
#include "./test.h"
void hoge(void){
	printf("hoge!n");
}

main.cpp

extern "C"{
	#include "./test.h"
}
int main(void){
	hoge();
	return 0;
}

参考記事
参考記事続編

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です