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

如何實(shí)現(xiàn)在C++中調(diào)用C函數(shù)

 更新時(shí)間:2023年08月02日 09:02:10   作者:花好約猿上王者  
這篇文章主要介紹了如何實(shí)現(xiàn)在C++中調(diào)用C函數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

如何在C++中調(diào)用C函數(shù)

假如在一個(gè)項(xiàng)目中同時(shí)包含了C和C++,當(dāng)C++調(diào)用C函數(shù)時(shí),以傳統(tǒng)C編程#include "xxx.h"后,聲明函數(shù)。

由于main.cpp 是個(gè)C++代碼,以C方式的調(diào)用,g++編譯器無法通過編譯。

解決方案一

重寫一個(gè)專門被c++用的頭文件(可能存在是別人已經(jīng)寫好的頭文件,我們無法修改等問題)

e.g. 添加一個(gè)頭文件 tansfer.h

extern "C" {
#include "file1.h"
#include "file2.h"
}

最后在需要調(diào)用C函數(shù)的cpp文件(即C++文件)中,引用頭文件 tansfer.h即可。

解決方案二

在xxx.h中的每個(gè)函數(shù)最前面添加:extern “C”

extern "C" {?
? ? void fun1(int arg1);?
? ? void fun2(int arg1, int arg2);?
? ? void fun3(int arg1, int arg2, int arg3);?
}

解決方案三

在代碼兼容而且少的前提下,更改C文件為cpp文件。

C++程序調(diào)用c函數(shù)(extern “C“的使用)

概念

c++程序調(diào)用c函數(shù),即為在xx.cpp文件中調(diào)用在func.c文件中實(shí)現(xiàn)的函數(shù)

extern "C"的主要作用是為了實(shí)現(xiàn)c++代碼能夠調(diào)用c語言代碼。加上extern "C"后,這部分代碼編譯器按c語言的方式進(jìn)行編譯和鏈接,而不是c++的方式。

原理

由于c++中需要支持函數(shù)重載,所以c和c++中對(duì)同一個(gè)函數(shù)經(jīng)過編譯后生成的函數(shù)名是不同的,這就會(huì)導(dǎo)致一個(gè)問題,如果在c++中調(diào)用一個(gè)使用c語言編寫模塊中的某個(gè)函數(shù),c++是按照c++的名稱修飾方式來查找并鏈接這個(gè)函數(shù),就會(huì)發(fā)生鏈接錯(cuò)誤。

  • c函數(shù):void func(),被編譯成函數(shù):func
  • c++函數(shù): void func(){},被編譯成函數(shù):_Z4funcv

示例代碼

1. 處理被調(diào)用的C頭文件

// my_module.h
#pragma once
#include<stdio.h>
#ifdef __cplusplus
extern "C"{
#endif
	void func1();
	int func2(int a,int b);
#ifdef __cplusplus
}
#endif
// my_module.c
#include "my_module.h"
void func1() {
  printf("hello world.");
}
int func2(int a, int b) {
  return a+b;
}
// test.cpp
#include "my_module.h"
#include<iostream>
using namespace std;
int main() {
  func1();
  cout << func2(10, 20) << endl;
}

編譯:

gcc -c my_module.c -o my_module.o
gcc -c test.cpp -o test.o
g++ *.o -o test? ?// c++代碼要用g++進(jìn)行鏈接

.c文件和.cpp不能混在一起編譯,要分別編譯成目標(biāo)文件.o,再進(jìn)行鏈接生成可執(zhí)行程序

2. 處理調(diào)用的c++文件

// my_module.h
#pragma once
#include <stdio.h>
void func1();
int func2(int a, int b);
// my_module.c
#include "my_module.h"
void func1() {
  printf("hello world.");
}
int func2(int a, int b) {
  return a+b;
}
// test.cpp
#include <iostream>
using namespace std;
extern "C" {
#include "my_module.h"
}
int main() {
  func1();
  cout << func2(1, 2) << endl;
}

編譯方式同上

基礎(chǔ)補(bǔ)充

gcc、g++編譯常用選項(xiàng):

選項(xiàng)含義
-o file指定生成的輸出文件名為file
-E只進(jìn)行預(yù)處理
-S(大寫)只進(jìn)行預(yù)處理和編譯
-c(小寫)只進(jìn)行預(yù)處理、編譯和匯編

C語言分步編譯:

1)預(yù)處理:宏定義展開、頭文件展開、條件編譯等,刪除注釋,這里不會(huì)檢查語法

gcc -E test.c -o test.i

2)編譯:檢查語法,將預(yù)處理后文件編譯成匯編文件

gcc -S test.i -o test.s

3)匯編:將匯編文件生成目標(biāo)文件(二進(jìn)制文件)

gcc -c test.s -o test.o

4)鏈接:C語言寫的程序是需要依賴各種庫的,編譯后還需要把庫鏈接到最終的可執(zhí)行程序中去

gcc test.o -o test

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語言互換最大值與最小值的位置

    C語言互換最大值與最小值的位置

    大家好,本篇文章主要講的是C語言互換最大值與最小值的位置,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • C語言實(shí)現(xiàn)類似wget的進(jìn)度條效果

    C語言實(shí)現(xiàn)類似wget的進(jìn)度條效果

    這篇文章主要介紹了C語言實(shí)現(xiàn)類似wget的進(jìn)度條效果的方法,主要是讓大家可以熟練的使用轉(zhuǎn)移符\r,這里推薦給大家,需要的小伙伴參考下。
    2015-03-03
  • OpenCV實(shí)現(xiàn)區(qū)域分割和區(qū)域生長

    OpenCV實(shí)現(xiàn)區(qū)域分割和區(qū)域生長

    區(qū)域分割是圖像處理中一個(gè)重要的任務(wù),本文主要介紹了OpenCV實(shí)現(xiàn)區(qū)域分割和區(qū)域生長,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • C++消息隊(duì)列(定義,結(jié)構(gòu),如何創(chuàng)建,發(fā)送與接收)

    C++消息隊(duì)列(定義,結(jié)構(gòu),如何創(chuàng)建,發(fā)送與接收)

    這篇文章主要介紹了C++消息隊(duì)列(定義,結(jié)構(gòu),如何創(chuàng)建,發(fā)送與接收),消息隊(duì)列是一種先進(jìn)先出的隊(duì)列型數(shù)據(jù)結(jié)構(gòu),實(shí)際上是系統(tǒng)內(nèi)核中的一個(gè)內(nèi)部鏈表
    2022-08-08
  • 基于C語言實(shí)現(xiàn)貪吃蛇小游戲

    基于C語言實(shí)現(xiàn)貪吃蛇小游戲

    這篇文章主要為大家詳細(xì)介紹了基于C語言實(shí)現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • c++11中關(guān)于std::thread的join的詳解

    c++11中關(guān)于std::thread的join的詳解

    這篇文章主要介紹了c++11中關(guān)于std::thread的join詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • C語言實(shí)現(xiàn)放煙花的程序

    C語言實(shí)現(xiàn)放煙花的程序

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)放煙花的程序,有音樂播放,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • Qt使用QJson模塊實(shí)現(xiàn)解析Json文件

    Qt使用QJson模塊實(shí)現(xiàn)解析Json文件

    在項(xiàng)目開發(fā)過程中,經(jīng)常會(huì)遇到讀寫Json文件的需求,掌握J(rèn)son文件的操作是基礎(chǔ)中的基礎(chǔ),下面我們就來看看如何使用QT內(nèi)置的QJson模塊解析Json文件吧
    2023-10-10
  • C++類和對(duì)象示例詳解

    C++類和對(duì)象示例詳解

    這篇文章給大家介紹了C++類和對(duì)象的相關(guān)知識(shí),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2026-05-05
  • C++實(shí)現(xiàn)投骰子的隨機(jī)游戲

    C++實(shí)現(xiàn)投骰子的隨機(jī)游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)投骰子的隨機(jī)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04

最新評(píng)論

西华县| 南雄市| 汕头市| 南丰县| 巩留县| 酉阳| 怀化市| 将乐县| 鄂伦春自治旗| 乐东| 新安县| 攀枝花市| 扎鲁特旗| 芜湖县| 东辽县| 迁西县| 临桂县| 封丘县| 包头市| 疏勒县| 信丰县| 罗定市| 安岳县| 改则县| 武平县| 荔浦县| 如东县| 尉犁县| 靖远县| 乌审旗| 嘉义县| 彩票| 墨脱县| 厦门市| 图木舒克市| 吉首市| 牟定县| 拉孜县| 普安县| 内丘县| 泸定县|