在C++代码中兼容C语言的库

正常使用C编译器

#include <stdio.h>

// 包含ffmpeg头文件
#include "libavutil/avutil.h"

int main()
{
    printf("Hello FFMPEG, version is %s\n", av_version_info());

    return 0;
}

如果使用C++编译器

需要在C++代码中兼容C语言的库

#include <iostream>

#ifdef __cplusplus  ///
extern "C"
{
// 包含ffmpeg头文件
#include "libavutil/avutil.h"
}
#endif
using namespace std;

int main()
{
    printf("Hello FFMPEG, version is %s\n", av_version_info());

    return 0;
}

__cplusplus

__cplusplus 是一个预定义的宏(由编译器自动定义的特殊宏,它们在程序中始终可用,不需要程序员显式定义),只有在用C++编译器编译代码时才会定义;如果代码在C编译器中编译,这个宏是未定义的。
这里是使用条件编译指令确保只有在C++环境下才执行相应代码块。

extern “C”

extern "C" 是C++中的一个关键字,用于指示函数或全局变量使用C语言的函数名修饰规则(也叫作链接规范)。

C和C++的函数名修饰规则不同。C++支持函数重载,所以C++编译器会对函数名进行“修饰”(即“name mangling”),使得编译后的函数名包含函数的参数信息;而C语言不支持函数重载,编译器不会修饰函数名,函数名保持原样。例如,C语言中的一个函数 void foo(int) 编译后的符号名仍然是 foo,但在C++中,它可能会被编译为类似于 foo_int 这样的形式。

使用 extern “C” 的原因:FFmpeg是用C语言编写的,因此其头文件定义的函数使用C语言的链接规范。如果你在C++代码中直接包含FFmpeg头文件,而不使用 extern “C”,C++编译器会对FFmpeg的函数名进行修饰,导致在链接阶段找不到正确的符号。所以在C++中包含C语言库时,通常需要使用 extern “C” 来避免函数名修饰,确保C++编译器正确解析C语言的符号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值