最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C和C++混合編程問題

 更新時間:2015年10月08日 21:31:46   投稿:mdxy-dxy  
這篇文章主要介紹了C和C++混合編程問題,需要的朋友可以參考下

分析以下一段代碼:

/*=======sum.h=========*/

#ifndef SUM_H
#define SUM_H
#include <stdio.h>

int sum(int a,int b);


#endif;

/*=======sum.c=========*/

#include "sum.h"


int sum(int a,int b)
{
int c=a+b;
return c;
}

/*====main.cpp======*/

#include "sum.h"

void mian(){

cout << sum(1,2)<<endl;

}

調(diào)用以上三個文件,編譯通過,但是執(zhí)行是出現(xiàn)以下問題:

obj : error LNK2001: 無法解析的外部符號 "int __cdecl sum(int,int)" (?sum@@YAHHH@Z)
E:\Programming\Grapic\test\Debug\test.exe : fatal error LNK1120: 1 個無法解析的外部命令

問題出在哪里呢? 在main.cpp里調(diào)用了sum.c,也就是說在C++程序里調(diào)用了C程序,此時如果沒有作相應(yīng)處理將會出現(xiàn)鏈接錯誤。


extern "C"表示編譯生成的內(nèi)部符號名使用C約定。C++支持函數(shù)重載,而C不支持,兩者的編譯規(guī)則也不一樣。函數(shù)被C++編譯后在符號庫中的名字與C語言的不同。例如,假設(shè)某個函數(shù)的原型為:void foo( int x, int y ); 該函數(shù)被C編譯器編譯后在符號庫中的名字可能為_foo,而C++編譯器則會產(chǎn)生像_foo_int_int之類的名字(不同的編譯器可能生成的名字不同,但是都采用了相同的機(jī)制,生成的新名字稱為“mangled name”)。_foo_int_int這樣的名字包含了函數(shù)名、函數(shù)參數(shù)數(shù)量及類型信息,C++就是靠這種機(jī)制來實(shí)現(xiàn)函數(shù)重載的。

那么如果在C中調(diào)用C++代碼,以及如何在C++中調(diào)用C的代碼呢?

extern "C"表示編譯生成的內(nèi)部符號名使用C約定。

1. 如何在C++中調(diào)用C呢?

C++調(diào)用C,extern "C" 的作用是:讓C++連接器找調(diào)用函數(shù)的符號時采用C的方式

本文開頭提出的筆試題可以這樣修改:

/*=======sum.h=========*/

#ifndef SUM_H
#define SUM_H
#include <stdio.h>

int sum(int a,int b);


#endif;

/*=======sum.c=========*/

#include "sum.h"


int sum(int a,int b)
{
int c=a+b;
return c;
}

/*====main.cpp======*/

extern "C"
{
#include "sum.h"
}

void mian(){

cout << sum(1,2)<<endl;

}

執(zhí)行成功

相信到這里差不多明白了

2. 怎樣在C里調(diào)用C++呢?

在C中引用C++函數(shù)(C調(diào)用C++,使用extern "C"則是告訴編譯器把cpp文件中extern "C"定義的函數(shù)依照C的方式來編譯封裝接口,當(dāng)然接口函數(shù)里面的C++語法還是按C++方式編譯)

執(zhí)行:test1.obj : error LNK2019: 無法解析的外部符號 _sum,該符號在函數(shù) _main 中被引用
E:\Programming\Grapic\test\Debug\test.exe : fatal error LNK1120: 1 個無法解析的外部命令

/*=======sum.h=========*/

#ifndef SUM_H
#define SUM_H
#include <stdio.h>

int sum(int a,int b);


#endif;

/*=======sum.cpp=========*/

#include "sum.h"


extern "C"
{
int sum(int a,int b)
{
int c=a+b;
return c;
}
}

/*====main.c======*/

#include "sum.h"

void mian(){

cout << sum(1,2)<<endl;

}

3. 標(biāo)準(zhǔn)規(guī)范寫法

一般我們都將函數(shù)聲明放在頭文件,當(dāng)我們的函數(shù)有可能被C或C++使用時,我們無法確定被誰調(diào)用,使得不能確定是否要將函數(shù)聲明在extern "C"里,所以,我們可以添加

#ifdef __cplusplus

extern "C"

{

#endif

//函數(shù)聲明

#ifdef __cplusplus

}

#endif

利用以上聲明形式就可以綜合運(yùn)用了。
在C中引用C++語言中的函數(shù)和變量時,C++的函數(shù)或變量要聲明在extern "C"{}里,但是在C語言中不能使用extern "C",否則編譯出錯。(出現(xiàn)錯誤: error C2059: syntax error : 'string',這個錯誤在網(wǎng)上找了很久,國內(nèi)網(wǎng)站沒有搜到直接說明原因的,原因是extern "C"是C++中的關(guān)鍵詞,不是C的,所有會出錯。

/*=======sum.h=========*/

#ifndef SUM_H
#define SUM_H
#include <stdio.h>

int sum(int a,int b);


#endif;

/*=======sum.cpp=========*/

#include "sum.h"


int sum(int a,int b)
{
int c=a+b;
return c;
}

/*====main.c======*/

#include "sum.h"

void mian(){

cout << sum(1,2)<<endl;

}

相關(guān)文章

  • C語言中回調(diào)函數(shù)和qsort函數(shù)的用法詳解

    C語言中回調(diào)函數(shù)和qsort函數(shù)的用法詳解

    這篇文章主要為大家詳細(xì)介紹一下C語言中回調(diào)函數(shù)和qsort函數(shù)的用法教程,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C語言有一定幫助,需要的可以參考一下
    2022-07-07
  • C語言?程序的編譯系統(tǒng)解析

    C語言?程序的編譯系統(tǒng)解析

    編譯程序的基本功能是把源程序(高級語言)翻譯成目標(biāo)程序。但是,作為一個具有實(shí)際應(yīng)用價值的編譯系統(tǒng),除了基本功能之外,還應(yīng)具備語法檢查、調(diào)試措施、修改手段、覆蓋處理、目標(biāo)程序優(yōu)化、不同語言合用以及人-機(jī)聯(lián)系等重要功能
    2022-02-02
  • C++中double浮點(diǎn)數(shù)精度丟失的深入分析

    C++中double浮點(diǎn)數(shù)精度丟失的深入分析

    這篇文章主要給大家介紹了關(guān)于C++中double浮點(diǎn)數(shù)精度丟失的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • VC小技巧匯總之窗口技巧

    VC小技巧匯總之窗口技巧

    這篇文章主要介紹了VC小技巧匯總之窗口技巧,功能非常實(shí)用,對于VC開發(fā)有一定借鑒價值,需要的朋友可以參考下
    2014-07-07
  • 使用Qt實(shí)現(xiàn)獲取本機(jī)IP和定位

    使用Qt實(shí)現(xiàn)獲取本機(jī)IP和定位

    這篇文章主要為大家詳細(xì)介紹了如何使用Qt實(shí)現(xiàn)獲取本機(jī)IP和定位,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • STL 的string類怎么啦

    STL 的string類怎么啦

    在我們研究string類犯了什么毛病之前,還讓我先說一下如何了解一個C++的類。我們要了解一個C++的類,一般來說,要從三個方面入手
    2013-11-11
  • C++ 打開選擇文件夾對話框選擇目錄的操作

    C++ 打開選擇文件夾對話框選擇目錄的操作

    這篇文章主要介紹了C++ 打開選擇文件夾對話框選擇目錄的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 用C++實(shí)現(xiàn)DBSCAN聚類算法

    用C++實(shí)現(xiàn)DBSCAN聚類算法

    本篇文章是對使用C++實(shí)現(xiàn)DBSCAN聚類算法的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • c語言執(zhí)行Hello?World背后經(jīng)歷的步驟

    c語言執(zhí)行Hello?World背后經(jīng)歷的步驟

    這篇文章介紹了c語言執(zhí)行Hello?World背后經(jīng)歷的步驟,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • 華為筆試算法題匯總

    華為筆試算法題匯總

    這篇文章主要為大家匯總了華為筆試算法題,每一題都給出了詳細(xì)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09

最新評論

万盛区| 怀化市| 化隆| 丰城市| 三都| 噶尔县| 赤峰市| 海盐县| 彩票| 拜泉县| 共和县| 方城县| 霍城县| 丰顺县| 大邑县| 偃师市| 朔州市| 阆中市| 高雄县| 平定县| 旺苍县| 新郑市| 尤溪县| 景泰县| 长岛县| 丁青县| 勃利县| 衡山县| 金塔县| 扎赉特旗| 酒泉市| 依兰县| 和林格尔县| 桦南县| 钟山县| 曲水县| 邢台市| 浦城县| 师宗县| 呼图壁县| 上栗县|