C++調用C接口

C++調用C代碼

一個C語言文件p.cios

#include <stdio.h>
void print(int a,int b)
{
       printf("這裏調用的是C語言的函數:%d,%d\n",a,b);
}

一個頭文件p.hshell

#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;
}

執行命令spa

gcc -c p.c
g++ -o main main.cpp p.o

編譯後連接出錯:main.cpp對print(int, int)未定義的引用。code

  • 編譯後連接出錯:main.cpp對print(int, int)未定義的引用。blog

  • 緣由分析圖片

    • p.c咱們使用的是C語言的編譯器gcc進行編譯的,其中的函數print
      編譯以後,在符號表中的名字爲 _print
    • 咱們連接的時候採用的是g++進行連接,也就是C++連接方式,程序在運行到調用
      print函數的代碼時,會在符號表中尋找_print_int_int(是按照C
      ++的連接方法來尋找的,因此是找_print_int_int而不是找_print
      )的名字,發現找不到,因此會t提示「未定義的引用」
    • 此時若是咱們在對print的聲明中加入 extern 「C」 ,這個時候,g
      ++編譯器就會按照C語言的連接方式進行尋找,也就是在符號表中尋找_print
      ,這個時候是能夠找到的,是不會報錯的。
  • 總結編譯器

    • 編譯後底層解析的符號不一樣,C語言是_print,C++是_print_int_int

解決調用失敗問題

修改p.h文件io

#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

結果示意:
在這裏插入圖片描述

相關文章
相關標籤/搜索