C++中如何調用C語言的代碼實現(xiàn)
為什么要是用 extern "C"
在進行C++開發(fā)的時候,由于C、C++編譯規(guī)則是不同的。C++編譯函數(shù)方法是 使用mangle的技術 。
void func(int age) {
}
void func(int age, int height) {
}
/*如果有這兩個函數(shù)要被調用,在C語言中函數(shù)重載是不允許的,那么在C++中為什么可以呢。
C++中就是使用了mangle技術,對函數(shù)重載的函數(shù)名加上編譯器中自定義規(guī)則的表示符,編譯之后的函數(shù)名就會不一樣。
例如 func(int age) -> func_int(int age)
func(int age, int height) -> func_int_int(int age, int height)
*/
而在C語言中是沒有這個技術的,所以如果我們想要調用C語言開發(fā)的一些API,就需要使用 extern "C" 修飾C語言的函數(shù)聲明。
extern "C" 用法
直接在函數(shù)前面加上 extern "C" 關鍵字
extern "C" void fun() {
printf("test");
}
如果有函數(shù)聲明與函數(shù)實現(xiàn),要讓函數(shù)聲明被 extern "C" 修飾,函數(shù)實現(xiàn)可以不修飾
extern "C" void func();
void func() {
cout << "func()" << endl;
}
如果有多個函數(shù)要被 extern "C" 修飾,可以直接用{}包裹
extern "C" {
void func();
void func1();
}
void func() {
cout << "func()" << endl;
}
void func1() {
cout << "func1()" << endl;
}
自定義C語言函數(shù)庫
但是我們每次使用C語言的API都用這個 extern "C" 修飾那是不是太麻煩了,那我們學會了怎么去使用 extern "C" ,我們可以在編寫C語言API庫的時候,直接使用這個來修飾,那么C++再去調用的時候就不用這么麻煩了,直接使用這個函數(shù)就可以了。
//在sum.h文件中定義sum函數(shù)
extern "C" {
int sum(int a, int b);
}
int sum(int a, int b) {
return a + b;
}
//在main.cpp文件中包含這個庫文件之后就可以直接使用了
int main()
{
cout << sum(1, 2) << endl;
getchar();
}
但是這么定義的話就會產(chǎn)生另一個問題,那么就是無法在C語言文件中調用這個庫
因為在C語言中是沒有 extern "C"
這個關鍵字的。調用這個庫,就是直接把這個庫的文件代碼拷貝過來。例如:
#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));
}
那么我們就需要在定義這個sum庫的時候 加上一些約束規(guī)則 ,讓他在被C++調用的時候加上 extern "C" 關鍵字,在被C語言調用的時候去掉這個關鍵字。
//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文件實現(xiàn)
#include "sum.h"
int sum(int a, int b) {
return a + b;
}
__cplusplus 這個宏是C++中 特有的 。它在加載C++文件的時候 會提前定義這個宏 ,所以我們只要 判斷文件中是否有這個宏 ,有的話就是C++在調用,沒有的話就是C語言,這樣就可以很好地解決了這個混合調用的問題。
到此這篇關于C++中如何調用C語言的代碼的文章就介紹到這了,更多相關C++調用C語言內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C語言sizeof與字符串處理與動態(tài)內存分配及main函數(shù)參數(shù)詳解
這篇文章主要介紹了C語言字符串處理函數(shù)、sizeof、動態(tài)內存分配函數(shù)、main函數(shù)參數(shù)問題,static在修飾變量的時候,如果是修飾全局變量,則跟全局變量功能一樣,通過示例代碼給大家介紹的非常詳細,需要的朋友可以參考下2022-07-07
解析C++編程中異常相關的堆棧展開和throw()異常規(guī)范
這篇文章主要介紹了C++編程中異常相關的堆棧展開和throw()異常規(guī)范,throw()規(guī)范部分文中結合了C++11標準的新特性來講,需要的朋友可以參考下2016-01-01

