C++呼叫C程式碼
一個C語言檔案p.c
#include <stdio.h>
void print(int a,int b)
{
printf("這裡呼叫的是C語言的函式:%d,%d\n",a,b);
}
一個標頭檔案p.h
#ifndef _P_H
#define _P_H
void print(int a,int b);
#endif
C++檔案呼叫C函式
#include <iostream>
using namespace std;
#include "p.h"
int main()
{
cout<<"現在呼叫C語言函式\n";
print(3,4);
return 0;
}
執行命令
gcc -c p.c
g++ -o main main.cpp p.o
編譯後連結出錯:main.cpp對print(int, int)未定義的引用。
-
編譯後連結出錯:main.cpp對print(int, int)未定義的引用。
-
原因分析
- p.c我們使用的是C語言的編譯器gcc進行編譯的,其中的函式print
編譯之後,在符號表中的名字為 _print - 我們連結的時候採用的是g++進行連結,也就是C++連結方式,程式在執行到呼叫
print函式的程式碼時,會在符號表中尋找_print_int_int(是按照C
++的連結方法來尋找的,所以是找_print_int_int而不是找_print
)的名字,發現找不到,所以會t提示“未定義的引用” - 此時如果我們在對print的宣告中加入 extern “C” ,這個時候,g
++編譯器就會按照C語言的連結方式進行尋找,也就是在符號表中尋找_print
,這個時候是可以找到的,是不會報錯的。
- p.c我們使用的是C語言的編譯器gcc進行編譯的,其中的函式print
-
總結
- 編譯後底層解析的符號不同,C語言是_print,C++是_print_int_int
解決呼叫失敗問題
修改p.h檔案
#ifndef _P_H
#define _P_H
extern "C"{
void print(int a,int b);
}
#endif
修改後再次執行命令
gcc -c p.c
g++ -o main main.cpp p.o
./main
執行無報錯
思考:那C程式碼能夠被C程式呼叫嗎
實驗:定義main,c函式如下
#include <stdio.h>
#include "p.h"
int main()
{
printf("現在呼叫C語言函式\n");
print(3,4);
return 0;
}
重新執行命令如下
gcc -c p.c
gcc -o mian main.c p.o
報錯:C語言裡面沒有extern “C“這種寫法
C程式碼既能被C++呼叫又能被C呼叫
為了使得p.c程式碼既能被C++呼叫又能被C呼叫
將p.h修改如下
#ifndef _P_H
#define _P_H
#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* __cplusplus */
void print(int a,int b);
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */
#endif /* __P_H */
再次執行命令
gcc -c p.c
gcc -o mian main.c p.o
./mian
結果示意: