今天做了一個錯誤的決定, 想說在一堆 C 程式裡呼叫另一堆 C++ 程式。邊弄邊學, 最後發現什麼都沒改的情況, 改用 g++ link 原本的 C 程式就會爆炸。想想還是撿要用的一小部份程式出來, 另寫 C 的程式比較單純。不過也藉這機會, 才讓我真的搞懂這之中發生什麼事。
先附上要用的範例, 再來慢慢廢話, 沒耐心的人直接玩範例可能就懂了。
原始碼
/* b.h */
#ifndef _B_H_
#define _B_H_
#ifdef __cplusplus
extern "C" {
#endif
int add(int a, int b);
#ifdef __cplusplus
}
#endif
#endif
/* b.cpp */
#include "b.h"
int add(int a, int b) {
return a + b;
}
/* a.c */
#include <stdio.h>
#include "b.h"
int main(void) {
printf("%d\n", add(3, 5));
return 0;
}
編譯方式
$ gcc -c a.c
$ g++ -c b.cpp
$ g++ a.o b.o -o a
$ ./a # 輸出 8
說明
《How to mix C and C++ Updated! , C++ FAQ》將 C 和 C++ 互相呼叫的各式注意事項寫得相當清楚, 不愧為 FAQ 啊! 其中在 C 呼叫 C++ 的函式時, 要注意幾點 C++ 有 name mangling, 也就是不管是 class method 還是 function, 名稱 X 編出來都不會是 X, 而 C 通常沒有 name mangling。不過不管 C 是否有 name mangling, 關鍵是讓 C 能用 C 的方式認得 C++ 的 symbol。
先明白編譯、連結時發生了什麼事, 從這裡出發, 可知要讓 C 呼叫到 C++ 的函式, 要從幾個地方下手: