设为首页 加入收藏

TOP

C++ 项目中的extern "C" (三)
Tags:项目 extern " C"
关键字(原因在extern关键字那节已经介绍)。它的代码如下:

#ifndef C_HEADER
#define C_HEADER

extern void print(int i);

#endif C_HEADER
1
#ifndef C_HEADER
2
#define C_HEADER
 
3
 
void print(
4
extern
int
i);
 
5
 
6
#endif C_HEADER

相对应的实现文件为cHeader.c的代码为:

#i nclude <stdio.h>
#i nclude "cHeader.h"
void print(int i)
{
printf("cHeader %d\n",i);
}
1
#i nclude <stdio.h>
2
#i nclude "cHeader.h"
print(int
3
void
i)
4
{
printf(
5
    
"cHeader %d\n"
,i);
6
}

现在C++(www.cppentry.com)的代码文件C++(www.cppentry.com).cpp中引用C中的print(int i)函数:

extern "C"{
#i nclude "cHeader.h"
}

int main(int argc,char** argv)
{
print(3);
return 0;
}
"C"{
1
extern
2
#i nclude "cHeader.h"
3
}
 
4
 
main(int
5
int
argc,
char** argv)
6
{
print(3);
7
    
return 0;
8
    
9
}

执行程序输出:

image 

3.4、C中调用C++(www.cppentry.com)的代码

现在换成在C中调用C++(www.cppentry.com)的代码,这与在C++(www.cppentry.com)中调用C的代码有所不同。如下在cppHeader.h头文件中定义了下面的代码:

#ifndef CPP_HEADER
#define CPP_HEADER

extern "C" void print(int i);

#endif CPP_HEADER
1
#ifndef CPP_HEADER
2
#define CPP_HEADER
 
3
 
"C"void
4
extern
print(
int i);
 
5
 
6
#endif CPP_HEADER

相应的实现文件cppHeader.cpp文件中代码如下:

#i nclude "cppHeader.h"

#i nclude <iostream>
using namespace std;
void print(int i)
{
cout<<"cppHeader "<<i<<endl;
}
1
#i nclude "cppHeader.h"
 
2
 
3
#i nclude <iostream>
namespace std;
4
using
print(int
5
void
i)
6
{
cout<<"cppHeader "
7
    
<<i<<endl;
8
}

在C的代码文件c.c中调用print函数:

extern int print(int i);
int main(int argc,char** argv)
{
print(3);
return 0;
}
int print(
1
extern
int
i);
main(int
2
int
argc,
char** argv)
3
{
print(3);
4
    
return 0;
5
    
6
}

注意在C的代码文件中直接#i nclude "cppHeader.h"头文件,编译出错。而且如果不加extern int print(int i)编译也会出错。

4、C和C++(www.cppentry.com)混合调用特别之处函数指针

当我们C和C++(www.cppentry.com)混合编程(www.cppentry.com)时,有时候会用一种语言定义函数指针,而在应用中将函数指针指向另一中语言定义的函数。如果C和C++(www.cppentry.com)共享同一中编译和连接、函数调用机制,这样做是可以的。然而,这样的通用机制,通常不然假定它存在,因此我们必须小心地确保函数以期望的方式调用。

而且当指定一个函数指针的编译和连接方式时,函数的所有类型,包括函数名、函数引入的变量也按照指定的方式编译和连接。如下例:

typedef int (*FT) (const void* ,const void*);//style of C++(www.cppentry.com)

extern "C"{
typedef int (*CFT) (const void*,const void*);//style of C
void qsort(void* p,size_t n,size_t sz,CFT cmp);//style of C
}

void isort(void* p,size_t n,size_t sz,FT cmp);//style of C++(www.cppentry.com)
void xsort(void* p,size_t n,size_t sz,CFT cmp);//style of C

//style of C
extern "C" void ysort(void* p,size_t n,size_t sz,FT cmp);

int compare(const void*,const void*);//style of C++(www.cppentry.com)
extern "C" ccomp(const void*,const void*);//style of C

vo
首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇string类型与int,float类型转换 下一篇C++ 枚举子相关类型解析

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: