亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++如何調用已經(jīng)寫好的C接口

 更新時間:2021年10月14日 15:57:51   作者:deroy  
如何在C++代碼中調用寫好的C接口?你可能會奇怪,C++不是兼容C嗎?直接調用不就可以了,那么我們來測試一下,先看看C++如何調用C代碼接口的,需要的朋友可以參考一下

前言:

如何在C++代碼中調用寫好的C接口?你可能會奇怪,C++不是兼容C嗎?直接調用不就可以了,那么我們來測試一下,先看看C++如何調用C代碼接口的。

1、C++調用C文件

一個C語言文件test.c

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


一個頭文件test.h

#ifndef _TEST_H 
#define _TEST_H 
 
void print(int a,int b); 
 
#endif 


C++文件調用C函數(shù)

#include <iostream> 
using namespace std; 
#include "test.h" 
int main() 
{ 
   cout<<"現(xiàn)在調用C語言函數(shù)\n"; 
   print(3,4); 
   return 0; 
} 

執(zhí)行命令

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

編譯后鏈接出錯:main.cppprint(int, int)未定義的引用。

那么g++編譯器為什么找不到print(int,int)呢,其實在我們學C++重載的時候就提到過C++底層的編譯原理。

2、原因分析

test.c我們使用的是C語言的編譯器gcc進行編譯的,其中的函數(shù)print編譯之后,在符號表中的名字為 print,通過nm查看.o文件.

$ gcc -c test.c 
$ nm test.o  
                 U _GLOBAL_OFFSET_TABLE_ 
0000000000000000 T print 
                 U printf 


我們鏈接的時候采用的是 g++ 進行鏈接,也就是 C++ 鏈接方式,程序在運行到調用 print 函數(shù)的代碼時,會在符號表中尋找 _Z5printii(是按照C++的鏈接方法來尋找的,所以是找 _Z5printii 而不是找 print)的名字,發(fā)現(xiàn)找不到,所以會提示“未定義的引用”

$ g++ -c test.c 
$ ls 
main.cpp  makefile  test.c  test.h  test.o 
$ nm test.o 
                 U _GLOBAL_OFFSET_TABLE_ 
                 U printf 
0000000000000000 T _Z5printii 


此時如果我們在對print的聲明中加入 extern “C” ,這個時候,g++編譯器就會按照C語言的鏈接方式進行尋找,也就是在符號表中尋找print(這才是C++兼容C),這個時候是可以找到的,是不會報錯的。

總結:

編譯后底層解析的符號不同,C語言是 _print,C++ __Z5printii

3、解決調用失敗問題

修改test.h文件

#ifndef _TEST_H 
#define _TEST_H 
extern "C"{ 
void print(int a,int b); 
} 
#endif 


修改后再次執(zhí)行命令

gcc -c test.c 
g++ -o main main.cpp test.o 
./main 


運行無報錯

4、思考:那C語言能夠調用C接口嗎

實驗:定義main.c函數(shù)如下

#include <stdio.h> 
#include "test.h" 
int main() 
{ 
    printf("現(xiàn)在調用C語言函數(shù)\n"); 
    print(3,4); 
    return 0; 
} 

重新執(zhí)行命令如下

gcc -c test.c 
gcc -o mian main.c test.o 


報錯:C語言里面沒有extern “C“這種寫法

5、C接口既能被C++調用又能被C調用

為了使得test.c代碼既能被C++調用又能被C調用

將test.h修改如下

#ifndef __TEST_H__ 
#define __TEST_H__ 
 
#ifdef __cplusplus 
#if __cplusplus 
extern "C"{ 
#endif 
#endif /* __cplusplus */ 
 
extern void print(int a,int b); 
 
#ifdef __cplusplus 
#if __cplusplus 
} 
#endif 
#endif /* __cplusplus */ 
#endif /* __TEST_H__ */ 


ps:下期介紹一個Source Insight的插件,快速生成上面的代碼

再次執(zhí)行命令

gcc -c test.c 
gcc -o main main.c test.o 
./main 


結果示意:

到此這篇關于C++如何調用已經(jīng)寫好的C接口的文章就介紹到這了,更多相關C++如何調用C接口內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關文章

  • 關于C語言和命令行之間的交互問題

    關于C語言和命令行之間的交互問題

    這篇文章主要介紹了C語言和命令行之間的交互,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-07-07
  • Visual Studio Code運行程序時輸出中文成亂碼問題及解決方法

    Visual Studio Code運行程序時輸出中文成亂碼問題及解決方法

    這篇文章主要介紹了解決Visual Studio Code運行程序時輸出中文成亂碼問題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • C++/CLI在vs上的安裝和初步使用教程

    C++/CLI在vs上的安裝和初步使用教程

    本文給大家介紹C++/CLI在vs上的安裝和初步使用,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-07-07
  • C++實現(xiàn)指針空值的示例代碼

    C++實現(xiàn)指針空值的示例代碼

    本文主要介紹了C++實現(xiàn)指針空值的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • 數(shù)組中求第K大數(shù)的實現(xiàn)方法

    數(shù)組中求第K大數(shù)的實現(xiàn)方法

    本篇文章是對數(shù)組中求第K大數(shù)的實現(xiàn)方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 使用C語言如何輸出逆序數(shù)

    使用C語言如何輸出逆序數(shù)

    逆序數(shù)的就是把一個數(shù)倒過來,例如:1234那么它的逆序數(shù)就為4321,我們該如何是實現(xiàn)呢?下面這篇文章主要給大家介紹了關于使用C語言如何輸出逆序數(shù)的相關資料,需要的朋友可以參考下
    2022-01-01
  • C語言字符函數(shù)中的isalnum()和iscntrl()你都知道嗎

    C語言字符函數(shù)中的isalnum()和iscntrl()你都知道嗎

    這篇文章主要為大家詳細介紹了C語言字符函數(shù)中的isalnum()和iscntrl(),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Qt編寫地圖實現(xiàn)省市區(qū)域圖的示例代碼

    Qt編寫地圖實現(xiàn)省市區(qū)域圖的示例代碼

    本文主要介紹了Qt編寫地圖實現(xiàn)省市區(qū)域圖的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • C語言函數(shù)棧幀的創(chuàng)建和銷毀介紹

    C語言函數(shù)棧幀的創(chuàng)建和銷毀介紹

    大家好,本篇文章主要講的是C語言函數(shù)棧幀的創(chuàng)建和銷毀介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2021-12-12
  • C++中的函數(shù)修飾符深入講解

    C++中的函數(shù)修飾符深入講解

    這篇文章主要給大家介紹了關于C++中函數(shù)修飾符的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-02-02

最新評論