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

C++中如何調(diào)用C語言的代碼實(shí)現(xiàn)

 更新時(shí)間:2020年03月10日 08:34:29   作者:隨風(fēng)小朋友  
這篇文章主要介紹了C++中如何調(diào)用C語言的代碼實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

為什么要是用 extern "C"

在進(jìn)行C++開發(fā)的時(shí)候,由于C、C++編譯規(guī)則是不同的。C++編譯函數(shù)方法是 使用mangle的技術(shù) 。

void func(int age) {

}

void func(int age, int height) {

}
/*如果有這兩個(gè)函數(shù)要被調(diào)用,在C語言中函數(shù)重載是不允許的,那么在C++中為什么可以呢。
C++中就是使用了mangle技術(shù),對(duì)函數(shù)重載的函數(shù)名加上編譯器中自定義規(guī)則的表示符,編譯之后的函數(shù)名就會(huì)不一樣。
例如 func(int age) -> func_int(int age)
  func(int age, int height) -> func_int_int(int age, int height)
*/

而在C語言中是沒有這個(gè)技術(shù)的,所以如果我們想要調(diào)用C語言開發(fā)的一些API,就需要使用 extern "C" 修飾C語言的函數(shù)聲明。

extern "C" 用法

直接在函數(shù)前面加上 extern "C" 關(guān)鍵字

extern "C" void fun() {
	printf("test");
}

如果有函數(shù)聲明與函數(shù)實(shí)現(xiàn),要讓函數(shù)聲明被 extern "C" 修飾,函數(shù)實(shí)現(xiàn)可以不修飾

extern "C" void func();
void func() {
	cout << "func()" << endl;
}

如果有多個(gè)函數(shù)要被 extern "C" 修飾,可以直接用{}包裹

extern "C" {
	void func();
	void func1();
}
void func() {
	cout << "func()" << endl;
}
void func1() {
	cout << "func1()" << endl;
}

自定義C語言函數(shù)庫

但是我們每次使用C語言的API都用這個(gè) extern "C" 修飾那是不是太麻煩了,那我們學(xué)會(huì)了怎么去使用 extern "C" ,我們可以在編寫C語言API庫的時(shí)候,直接使用這個(gè)來修飾,那么C++再去調(diào)用的時(shí)候就不用這么麻煩了,直接使用這個(gè)函數(shù)就可以了。

//在sum.h文件中定義sum函數(shù)
extern "C" {
	int sum(int a, int b);
}

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

//在main.cpp文件中包含這個(gè)庫文件之后就可以直接使用了
int main()
{
	cout << sum(1, 2) << endl;
	getchar();
}

但是這么定義的話就會(huì)產(chǎn)生另一個(gè)問題,那么就是無法在C語言文件中調(diào)用這個(gè)庫

 

因?yàn)樵贑語言中是沒有 extern "C"

這個(gè)關(guān)鍵字的。調(diào)用這個(gè)庫,就是直接把這個(gè)庫的文件代碼拷貝過來。例如:

#include <stdio.h>
#include "sum.h"

extern "C" {
	int sum(int a, int b);
}

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

void main() {
	printf("%d", sum(3, 4));
}

那么我們就需要在定義這個(gè)sum庫的時(shí)候 加上一些約束規(guī)則 ,讓他在被C++調(diào)用的時(shí)候加上 extern "C" 關(guān)鍵字,在被C語言調(diào)用的時(shí)候去掉這個(gè)關(guān)鍵字。

//sum.h文件聲明
#ifndef __SUM_H
#define __SUM_H

#ifdef __cplusplus
extern "C" {
#endif
 int sum(int a, int b);
#ifdef __cplusplus
}
#endif
#endif

//sum.c文件實(shí)現(xiàn)
#include "sum.h"
int sum(int a, int b) {
	return a + b;
}

__cplusplus 這個(gè)宏是C++中 特有的 。它在加載C++文件的時(shí)候 會(huì)提前定義這個(gè)宏 ,所以我們只要 判斷文件中是否有這個(gè)宏 ,有的話就是C++在調(diào)用,沒有的話就是C語言,這樣就可以很好地解決了這個(gè)混合調(diào)用的問題。

到此這篇關(guān)于C++中如何調(diào)用C語言的代碼的文章就介紹到這了,更多相關(guān)C++調(diào)用C語言內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言版三子棋游戲?qū)崿F(xiàn)代碼

    C語言版三子棋游戲?qū)崿F(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了C語言版三子棋游戲的實(shí)現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C語言基于圖形庫實(shí)現(xiàn)雙人貪吃蛇

    C語言基于圖形庫實(shí)現(xiàn)雙人貪吃蛇

    這篇文章主要為大家詳細(xì)介紹了C語言基于圖形庫實(shí)現(xiàn)雙人貪吃蛇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 利用boost獲取時(shí)間并格式化的方法

    利用boost獲取時(shí)間并格式化的方法

    下面小編就為大家?guī)硪黄胋oost獲取時(shí)間并格式化的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • C語言sizeof與字符串處理與動(dòng)態(tài)內(nèi)存分配及main函數(shù)參數(shù)詳解

    C語言sizeof與字符串處理與動(dòng)態(tài)內(nèi)存分配及main函數(shù)參數(shù)詳解

    這篇文章主要介紹了C語言字符串處理函數(shù)、sizeof、動(dòng)態(tài)內(nèi)存分配函數(shù)、main函數(shù)參數(shù)問題,static在修飾變量的時(shí)候,如果是修飾全局變量,則跟全局變量功能一樣,通過示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • 詳解C++中shared_ptr的使用教程

    詳解C++中shared_ptr的使用教程

    shared_ptr能夠記錄對(duì)象被引用的次數(shù),主要被用來管理動(dòng)態(tài)創(chuàng)建的對(duì)象的銷毀,這里我們就來詳解C++中shared_ptr的使用教程,需要的朋友可以參考下
    2016-05-05
  • C++構(gòu)造函數(shù)初始化順序詳解

    C++構(gòu)造函數(shù)初始化順序詳解

    這篇文章主要介紹了C++構(gòu)造函數(shù)初始化順序詳解,是對(duì)C++代碼的運(yùn)行機(jī)制深入探討,需要的朋友可以參考下
    2014-10-10
  • C語言實(shí)現(xiàn)頁面置換算法

    C語言實(shí)現(xiàn)頁面置換算法

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)頁面置換算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 解析C++編程中異常相關(guān)的堆棧展開和throw()異常規(guī)范

    解析C++編程中異常相關(guān)的堆棧展開和throw()異常規(guī)范

    這篇文章主要介紹了C++編程中異常相關(guān)的堆棧展開和throw()異常規(guī)范,throw()規(guī)范部分文中結(jié)合了C++11標(biāo)準(zhǔn)的新特性來講,需要的朋友可以參考下
    2016-01-01
  • C/C++ MD5算法的實(shí)現(xiàn)代碼

    C/C++ MD5算法的實(shí)現(xiàn)代碼

    下面就將網(wǎng)上有關(guān)MD5算法一些知識(shí)整理一下,方面自己查閱,需要的朋友可以參考下
    2017-07-07
  • C語言char s[]和char* s的區(qū)別

    C語言char s[]和char* s的區(qū)別

    本文主要介紹了C語言char s[]和char* s的區(qū)別,詳細(xì)講述了數(shù)組,指針的使用,具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06

最新評(píng)論