欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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之類的名字(不同的編譯器可能生成的名字不同,但是都采用了相同的機制,生成的新名字稱為“mangled name”)。_foo_int_int這樣的名字包含了函數(shù)名、函數(shù)參數(shù)數(shù)量及類型信息,C++就是靠這種機制來實現(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的方式來編譯封裝接口,當然接口函數(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. 標準規(guī)范寫法

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

#ifdef __cplusplus

extern "C"

{

#endif

//函數(shù)聲明

#ifdef __cplusplus

}

#endif

利用以上聲明形式就可以綜合運用了。
在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/C++實現(xiàn)segy文件的讀取詳解

    C/C++實現(xiàn)segy文件的讀取詳解

    SEGY是地震數(shù)據(jù)一般以地震道為單位進行組織,采用SEG-Y文件格式存儲。標準SEGY文件一般包括三部分:卷頭、道頭與地震道數(shù)據(jù)。本文將介紹利用C++讀取segy文件的方法,感興趣的可以了解一下
    2022-03-03
  • C語言使用普通循環(huán)方法和遞歸求斐波那契序列示例代碼

    C語言使用普通循環(huán)方法和遞歸求斐波那契序列示例代碼

    這篇文章主要介紹了C語言使用普通循環(huán)方法和遞歸求斐波那契序列示例代碼,大家參考使用吧
    2013-11-11
  • C/C++詳解實現(xiàn)二層轉(zhuǎn)發(fā)

    C/C++詳解實現(xiàn)二層轉(zhuǎn)發(fā)

    數(shù)據(jù)鏈路層是開放系統(tǒng)互連 (OSI) 模型中的第二層,該層用于通過 LAN 等單一網(wǎng)絡(luò)進行通信的節(jié)點,第二層數(shù)據(jù)包不能從一個網(wǎng)絡(luò)傳輸?shù)搅硪粋€網(wǎng)絡(luò)。而二層轉(zhuǎn)發(fā)是根據(jù)報文的目的MAC直接進行轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)過程中不用對報文的頭部做任何的修改
    2022-05-05
  • Qt實現(xiàn)抽獎小游戲的三種方式

    Qt實現(xiàn)抽獎小游戲的三種方式

    本文主要介紹了Qt實現(xiàn)抽獎小游戲的三種方式,主要包括while循環(huán),定時器,線程這三種方法,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • 生成隨機數(shù)rand函數(shù)的用法詳解

    生成隨機數(shù)rand函數(shù)的用法詳解

    本篇文章是對生成隨機數(shù)rand函數(shù)的用法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言實現(xiàn)動態(tài)版通訊錄的代碼分享

    C語言實現(xiàn)動態(tài)版通訊錄的代碼分享

    這篇文章主要為大家詳細介紹了如何利用C語言實現(xiàn)一個簡單的動態(tài)版通訊錄,主要運用了結(jié)構(gòu)體,一維數(shù)組,函數(shù),分支與循環(huán)語句等等知識,需要的可以參考一下
    2023-01-01
  • c++ 臨時對象的來源

    c++ 臨時對象的來源

    大家可能對這個臨時對象這個概念還不是很清楚,那么首先我們花一些時間來理解臨時對象
    2013-01-01
  • C語言中qsort函數(shù)的用法實例詳解

    C語言中qsort函數(shù)的用法實例詳解

    這篇文章主要介紹了C語言中qsort函數(shù)的用法實例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • C語言實現(xiàn)手寫Map(數(shù)組+鏈表+紅黑樹)的示例代碼

    C語言實現(xiàn)手寫Map(數(shù)組+鏈表+紅黑樹)的示例代碼

    這篇文章主要為大家詳細介紹了如何利用C語言實現(xiàn)手寫Map(數(shù)組+鏈表+紅黑樹),文中的示例代碼講解詳細,對我們學(xué)習(xí)有一定借鑒價值,需要的可以參考一下
    2022-09-09
  • c++學(xué)習(xí)之構(gòu)造函數(shù)

    c++學(xué)習(xí)之構(gòu)造函數(shù)

    類多么重要我就不多說了,只講講學(xué)習(xí),因為個人認為類的學(xué)習(xí)無論從概念的理解還是實際代碼的編寫相對其他C兼容向的代碼都是比較有難度的, 對于以前學(xué)C 的人來說這才是真正的新概念和內(nèi)容,STL其實還比較好理解,不就是一個更大的函數(shù)庫和代碼可以使用嘛。
    2015-06-06

最新評論