C语言---之C调用C++代码

在是此功能需要使用到extern “C”
头文件如下

#ifndef GETWH_H
#define GETWH_H

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void getWH(const char* filename,int* width ,int *height);
#endif // GETWH_H

C++中代码

#include <iostream>
#include"MediaInfoDLL/MediaInfoDLL.h"
#include"string"
using namespace std;
using namespace MediaInfoDLL;
 //extern “C” 按照标准来实现   关键点
extern "C"{
#include"getwh.h"
}
void getWH(const char*filename,int*width,int *height)
{
    MediaInfo MI;
    String w,h;
    MI.Open(__T(filename));
    w = MI.Get(stream_t::Stream_Video,0,__T("Width"));
    h = MI.Get(stream_t::Stream_Video,0,__T("Height"));
    *width =atoi(w.c_str());
    *height=atoi(h.c_str());
    return ;
}

c调用

#include <stdio.h>
#include"getwh.h"
int main()
{
    int w=0;
    int h=0;
    getWH("/home/liwei/vlc-2.2.0/test.265",&w,&h);
    printf("w =%d,h=%d\n",w,h);
    printf("Hello World!\n");
    return 0;
}

extern"C"的用法

那么,这种写法什么用呢?实际上,这是为了让CPP能够与C接口而采用的一种语法形式。之所以采用这种方式,是因为两种语言之间的一些差异所导致的。由于CPP支持多态性,也就是具有相同函数名的函数可以完成不同的功能,CPP通常是通过参数区分具体调用的是哪一个函数。在编译的时候,CPP编译器会将参数类型和函数名连接在一起,于是在程序编译成为目标文件以后,CPP编译器可以直接根据目标文件中的符号名将多个目标文件连接成一个目标文件或者可执行文件。但是在C语言中,由于完全没有多态性的概念,C编译器在编译时除了会在函数名前面添加一个下划线之外,什么也不会做(至少很多编译器都是这样干的)。由于这种的原因,当采用CPP与C混合编程的时候,就可能会出问题。假设在某一个头文件中定义了这样一个函数:

int foo(int a, int b);  
  •  

而这个函数的实现位于一个.c文件中,同时,在.cpp文件中调用了这个函数。那么,当CPP编译器编译这个函数的时候,就有可能会把这个函数名改成_fooii,这里的ii表示函数的第一参数和第二参数都是整型。而C编译器却有可能将这个函数名编译成_foo。也就是说,在CPP编译器得到的目标文件中,foo()函数是由_fooii符号来引用的,而在C编译器生成的目标文件中,foo()函数是由_foo指代的。但连接器工作的时候,它可不管上层采用的是什么语言,它只认目标文件中的符号。于是,连接器将会发现在.cpp中调用了foo()函数,但是在其它的目标文件中却找不到_fooii这个符号,于是提示连接过程出错。extern “C” {}这种语法形式就是用来解决这个问题的。本文将以示例对这个问题进行说明。

 
---------------------  
作者:--天行健地势坤--  
来源:CSDN  
原文:https://blog.csdn.net/u011573853/article/details/72360331  
版权声明:本文为博主原创文章,转载请附上博文链接!

这样的代码到底是什么意思呢?首先,__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码,也就是说,上面的代码的含义是:如果这是一段cpp的代码,那么加入extern "C"{和}处理其中的代码。

#ifdef __cplusplus

注意:

我的理解是如果使用.c或者.cc后缀名,就需要使用ifdef _cplusplus来表明这是一个C++文件,否则编译器有可能通不过

转载:https://bbs.csdn.net/topics/392310639?list=lz

转载:https://blog.csdn.net/monroed/article/details/54880944

猜你喜欢

转载自blog.csdn.net/zxyhhjs2017/article/details/84400304