目錄
零基礎(chǔ) C/C++ 學(xué)習(xí)路線推薦 : C/C++ 學(xué)習(xí)目錄 >> C 語言基礎(chǔ)入門
一.extern “C” 簡介
在 C++ 出現(xiàn)以前茧痕,很多代碼都是 C 語言寫的吼拥,而且很底層的庫也是 C 語言寫的兢孝,為了更好的支持原來的 C 代碼和已經(jīng)寫好的 C 語言庫具壮,需要在 C++ 中盡可能的支持 C ,而 extern “C” 就是其中的一個策略桌肴。
extern “C” 主要作用就是為了能夠正確實(shí)現(xiàn) C++ 代碼調(diào)用其他 C 語言代碼蛋辈。
extern “C” 會指示編譯器這部分代碼按 C 語言的進(jìn)行編譯瑟慈,而不是 C++漫谷。
二.extern “C” 實(shí)戰(zhàn)
1.頭文件使用 extern “C”
/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言教程 - C語言 extern "C"
//@Time:2021/07/14 07:30
//@Motto:不積跬步無以至千里羽圃,不積小流無以成江海,程序人生的精彩需要堅(jiān)持不懈地積累抖剿!
/******************************************************************************************/
#ifdef __cplusplus
extern "C" {
#endif
#include <libavcodec/avcodec.h>
#include <libavutil/opt.h>
#include <libavutil/imgutils.h>
#ifdef __cplusplus
}
#endif
2.函數(shù)聲明使用 extern “C”
/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言教程 - C語言 extern "C"
//@Time:2021/07/14 07:30
//@Motto:不積跬步無以至千里朽寞,不積小流無以成江海,程序人生的精彩需要堅(jiān)持不懈地積累斩郎!
/******************************************************************************************/
//寫法一
#ifdef __cplusplus
extern "C"{
#endif
int add1(int num1, int num2);
int add2(int num1, int num2);
#ifdef __cplusplus
};
#endif
//寫法二
extern "C" int add1(int num1, int num2);
extern "C" int add2(int num1, int num2);
三.extern “C” 使用場景
- 1脑融、C++代碼調(diào)用 C 語言代碼;
- 2缩宜、在 C++的頭文件中使用肘迎;
- 3、在多個人協(xié)同開發(fā)時(shí)锻煌,可能有的人比較擅長 C 語言妓布,而有的人擅長 C++,這樣的情況下也會有用到宋梧;
- 4匣沼、重點(diǎn)提示:如果是 C++ 調(diào)用由 C 語言編寫的第三方庫,必須使用 extern “C” 告訴編譯以 C 方式編譯捂龄,否則會出現(xiàn)編譯報(bào)錯的問題释涛;
四.extern “C” 使用模版
/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言教程 - C語言 extern "C"
//@Time:2021/07/14 07:30
//@Motto:不積跬步無以至千里,不積小流無以成江海倦沧,程序人生的精彩需要堅(jiān)持不懈地積累唇撬!
/******************************************************************************************/
#ifndef __CODERSRC_H__ /*防止該頭文件被重復(fù)引用*/
#define __CODERSRC_H__
#ifdef __cplusplus //告訴編譯器,這部分代碼按C語言的格式進(jìn)行編譯展融,而不是C++的
extern "C"{
#endif
/*.................................
* do something here
*.................................
*/
#ifdef __cplusplus
}
#endif
#endif /*end of __CODERSRC_H__*/
分析:頭文件中編譯宏”#ifndef __CODERSRC_H** 窖认、#define __CODERSRC_H**、#endif”作用是為了防止該頭文件被重復(fù)引用;
同時(shí)也是告訴編譯器告希,如果定義了__cplusplus( cpp 文件默認(rèn)定義了該宏),則采用 C 語言方式進(jìn)行編譯(即:在 c++ 中調(diào)用 c )扑浸;
重點(diǎn)提示:如果是 C++ 調(diào)用由 C 語言編寫的第三方庫,必須使用 extern “C” 告訴編譯以 C 方式編譯暂雹,否則會出現(xiàn)編譯報(bào)錯的問題首装;
例如:c++ 調(diào)用 ffmppeg 庫相關(guān)頭文件:
/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言教程 - C語言 extern "C"
//@Time:2021/07/14 07:30
//@Motto:不積跬步無以至千里,不積小流無以成江海杭跪,程序人生的精彩需要堅(jiān)持不懈地積累仙逻!
/******************************************************************************************/
#include <libavcodec/avcodec.h>
#include <libavutil/opt.h>
#include <libavutil/imgutils.h>
//調(diào)用 ffmpeg api
//編譯器報(bào)錯:
/home/sbyygyfd/svac_test/demo/test.cpp:207:對‘a(chǎn)vcodec_send_frame(AVCodecContext*, AVFrame const*)’未定義的引用
/home/sbyygyfd/svac_test/demo/test.cpp:214:對‘a(chǎn)vcodec_receive_packet(AVCodecContext*, AVPacket*)’未定義的引用
/home/sbyygyfd/svac_test/demo/test.cpp:224:對‘a(chǎn)v_packet_unref(AVPacket*)’未定義的引用
/tmp/cc8sUfgi.o:在函數(shù)‘main’中:
/home/sbyygyfd/svac_test/demo/test.cpp:804:對‘a(chǎn)vcodec_find_encoder_by_name(char const*)’未定義的引用
/home/sbyygyfd/svac_test/demo/test.cpp:810:對‘a(chǎn)vcodec_alloc_context3(AVCodec const*)’未定義的引用
/home/sbyygyfd/svac_test/demo/test.cpp:816:對‘a(chǎn)v_packet_alloc()’未定義的引用
/home/sbyygyfd/svac_test/demo/test.cpp:840:對‘a(chǎn)v_opt_set(void*, char const*, char const*, int)’未定義的引用
/home/sbyygyfd/svac_test/demo/test.cpp:843:對‘a(chǎn)vcodec_open2(AVCodecContext*, AVCodec const*, AVDictionary**)’未定義的引用
/home/sbyygyfd/svac_test/demo/test.cpp:855:對‘a(chǎn)v_frame_alloc()’未定義的引用
/home/sbyygyfd/svac_test/demo/test.cpp:864:對‘a(chǎn)v_frame_get_buffer(AVFrame*, int)’未定義的引用
/tmp/cc8sUfgi.o:在函數(shù)‘decode(unsigned char*, int, unsigned char, int)’中:
/*
解決方法: 添加
extern "C"
{
#include <libavcodec/avcodec.h>
#include <libavutil/opt.h>
#include <libavutil/imgutils.h>
}
*/
五.猜你喜歡
- C 語言 數(shù)組下標(biāo)越界和內(nèi)存溢出區(qū)別
- C 語言 指針聲明和定義
- C 語言 指針 p++ / p–
- C 語言 p++/§++/_(p++)/_p++
- C 語言 使用指針遍歷數(shù)組
- C 語言 指針和數(shù)組區(qū)別
- C 語言 指針數(shù)組和數(shù)組指針區(qū)別
- C 語言 空指針 NULL
- C 語言 void 指針
- C 語言 野指針
- C 語言 函數(shù)值傳遞和址傳遞
- C 語言 函數(shù)缺省參數(shù)
- C 語言 函數(shù)不定長參數(shù)
- C 語言 函數(shù)指針
- C 語言 指針函數(shù)
- C 語言 回調(diào)函數(shù) callback
- C 語言 typedef
- C 語言 define 定義常量
- C 語言 define 防止頭文件重復(fù)包含
- C 語言 #pragma once
- C 語言 #include <> 與 #include “” 區(qū)別
- C 語言 const 修飾變量
- C 語言 const 修飾指針
- C語言 const 修飾函數(shù)
- C 語言 const 修飾函數(shù)參數(shù)
- C 語言 const 和 define 區(qū)別
- C 語言 #運(yùn)算符
- C 語言 ##運(yùn)算符
- C 語言 extern “C”
未經(jīng)允許不得轉(zhuǎn)載:猿說編程 ? C 語言 extern “C”
本文由博客 - 猿說編程 猿說編程 發(fā)布!