目錄
- 一.extern “C” 簡介
- 二.extern “C” 實戰
- 1.頭檔案使用 extern “C”
- 2.函式宣告使用 extern “C”
- 三.extern “C” 使用場景
- 四.extern “C” 使用模版
- 五.猜你喜歡
零基礎 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”
本文由博客 - 猿說編程 猿說編程 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/299554.html
標籤:C
上一篇:Codeforces 1365D Solve The Maze
下一篇:服務注冊與發現的原理和實作
