目錄
零基礎 C/C++ 學習路線推薦 : C/C++ 學習目錄 >> C 語言基礎入門
一.extern “C” 簡介
在 C++ 出現以前,很多代碼都是 C 語言寫的,而且很底層的庫也是 C 語言寫的,為了更好的支持原來的 C 代碼和已經寫好的 C 語言庫,需要在 C++ 中盡可能的支持 C ,而 extern “C” 就是其中的一個策略。
extern “C” 主要作用就是為了能夠正確實現 C++ 代碼調用其他 C 語言代碼。
extern “C” 會指示編譯器這部分代碼按 C 語言的進行編譯,而不是 C++。
二.extern “C” 實戰
1.頭文件使用 extern “C”
/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言教程 - C語言 extern "C"
//@Time:2021/07/14 07:30
//@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅持不懈地積累!
/******************************************************************************************/
#ifdef __cplusplus
extern "C" {
#endif
#include <libavcodec/avcodec.h>
#include <libavutil/opt.h>
#include <libavutil/imgutils.h>
#ifdef __cplusplus
}
#endif
2.函數聲明使用 extern “C”
/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言教程 - C語言 extern "C"
//@Time:2021/07/14 07:30
//@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅持不懈地積累!
/******************************************************************************************/
//寫法一
#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++代碼調用 C 語言代碼;
- 2、在 C++的頭文件中使用;
- 3、在多個人協同開發時,可能有的人比較擅長 C 語言,而有的人擅長 C++,這樣的情況下也會有用到;
- 4、重點提示:如果是 C++ 調用由 C 語言編寫的第三方庫,必須使用 extern “C” 告訴編譯以 C 方式編譯,否則會出現編譯報錯的問題;
四.extern “C” 使用模版
/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言教程 - C語言 extern "C"
//@Time:2021/07/14 07:30
//@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅持不懈地積累!
/******************************************************************************************/
#ifndef __CODERSRC_H__ /*防止該頭文件被重復引用*/
#define __CODERSRC_H__
#ifdef __cplusplus //告訴編譯器,這部分代碼按C語言的格式進行編譯,而不是C++的
extern "C"{
#endif
/*.................................
* do something here
*.................................
*/
#ifdef __cplusplus
}
#endif
#endif /*end of __CODERSRC_H__*/
分析:頭文件中編譯宏”#ifndef __CODERSRC_H** 、#define __CODERSRC_H**、#endif”作用是為了防止該頭文件被重復引用;
同時也是告訴編譯器,如果定義了__cplusplus( cpp 文件默認定義了該宏),則采用 C 語言方式進行編譯(即:在 c++ 中調用 c );
重點提示:如果是 C++ 調用由 C 語言編寫的第三方庫,必須使用 extern “C” 告訴編譯以 C 方式編譯,否則會出現編譯報錯的問題;
例如:c++ 調用 ffmppeg 庫相關頭文件:
/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言教程 - C語言 extern "C"
//@Time:2021/07/14 07:30
//@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅持不懈地積累!
/******************************************************************************************/
#include <libavcodec/avcodec.h>
#include <libavutil/opt.h>
#include <libavutil/imgutils.h>
//調用 ffmpeg api
//編譯器報錯:
/home/sbyygyfd/svac_test/demo/test.cpp:207:對‘avcodec_send_frame(AVCodecContext*, AVFrame const*)’未定義的引用
/home/sbyygyfd/svac_test/demo/test.cpp:214:對‘avcodec_receive_packet(AVCodecContext*, AVPacket*)’未定義的引用
/home/sbyygyfd/svac_test/demo/test.cpp:224:對‘av_packet_unref(AVPacket*)’未定義的引用
/tmp/cc8sUfgi.o:在函數‘main’中:
/home/sbyygyfd/svac_test/demo/test.cpp:804:對‘avcodec_find_encoder_by_name(char const*)’未定義的引用
/home/sbyygyfd/svac_test/demo/test.cpp:810:對‘avcodec_alloc_context3(AVCodec const*)’未定義的引用
/home/sbyygyfd/svac_test/demo/test.cpp:816:對‘av_packet_alloc()’未定義的引用
/home/sbyygyfd/svac_test/demo/test.cpp:840:對‘av_opt_set(void*, char const*, char const*, int)’未定義的引用
/home/sbyygyfd/svac_test/demo/test.cpp:843:對‘avcodec_open2(AVCodecContext*, AVCodec const*, AVDictionary**)’未定義的引用
/home/sbyygyfd/svac_test/demo/test.cpp:855:對‘av_frame_alloc()’未定義的引用
/home/sbyygyfd/svac_test/demo/test.cpp:864:對‘av_frame_get_buffer(AVFrame*, int)’未定義的引用
/tmp/cc8sUfgi.o:在函數‘decode(unsigned char*, int, unsigned char, int)’中:
/*
解決方法: 添加
extern "C"
{
#include <libavcodec/avcodec.h>
#include <libavutil/opt.h>
#include <libavutil/imgutils.h>
}
*/
五.猜你喜歡
- C 語言 數組下標越界和內存溢出區別
- C 語言 指針聲明和定義
- C 語言 指針 p++ / p–
- C 語言 p++/§++/_(p++)/_p++
- C 語言 使用指針遍歷數組
- C 語言 指針和數組區別
- C 語言 指針數組和數組指針區別
- C 語言 空指針 NULL
- C 語言 void 指針
- C 語言 野指針
- C 語言 函數值傳遞和址傳遞
- C 語言 函數缺省參數
- C 語言 函數不定長參數
- C 語言 函數指針
- C 語言 指針函數
- C 語言 回調函數 callback
- C 語言 typedef
- C 語言 define 定義常量
- C 語言 define 防止頭文件重復包含
- C 語言 #pragma once
- C 語言 #include <> 與 #include “” 區別
- C 語言 const 修飾變量
- C 語言 const 修飾指針
- C語言 const 修飾函數
- C 語言 const 修飾函數參數
- C 語言 const 和 define 區別
- C 語言 #運算符
- C 語言 ##運算符
- C 語言 extern “C”
未經允許不得轉載:猿說編程 » C 語言 extern “C”
本文由博客 - 猿說編程 猿說編程 發布!