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>
}
*/

五.猜你喜欢

  1. C语言 数组下标越界和内存溢出区别
  2. C语言 指针声明和定义
  3. C语言 指针 p++ / p–
  4. C语言 p++/(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”
喜欢(2) 打赏

评论抢沙发

评论前必须登录!

不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!!

开始学习

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏