C語言 extern “C” - 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>
}
*/

五.猜你喜歡

  1. C 語言 數組下標越界和內存溢出區別
  2. C 語言 指針聲明和定義
  3. C 語言 指針 p++ / p–
  4. C 語言 p++/§++/_(p++)/_p++
  5. C 語言 使用指針遍歷數組
  6. C 語言 指針和數組區別
  7. C 語言 指針數組和數組指針區別
  8. C 語言 空指針 NULL
  9. C 語言 void 指針
  10. C 語言 野指針
  11. C 語言 函數值傳遞和址傳遞
  12. C 語言 函數缺省參數
  13. C 語言 函數不定長參數
  14. C 語言 函數指針
  15. C 語言 指針函數
  16. C 語言 回調函數 callback
  17. C 語言 typedef
  18. C 語言 define 定義常量
  19. C 語言 define 防止頭文件重復包含
  20. C 語言 #pragma once
  21. C 語言 #include <> 與 #include “” 區別
  22. C 語言 const 修飾變量
  23. C 語言 const 修飾指針
  24. C語言 const 修飾函數
  25. C 語言 const 修飾函數參數
  26. C 語言 const 和 define 區別
  27. C 語言 #運算符
  28. C 語言 ##運算符
  29. C 語言 extern “C”

未經允許不得轉載:猿說編程 » C 語言 extern “C”

本文由博客 - 猿說編程 猿說編程 發布!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM