C++中调用C语言库文件
2010-10-19 13:02
369 查看
我们都知道C++语言兼容C语言,那么C++调用C语言库,为什么为什么需要 extern "C"的帮助?
答案就是C++语言为了支持重构(重构的特征:相同的范围、相同的名字、不同的参数),在编译时对函数的命名方式进行了改变,编译后的名字包括一些参数的信息,这样才能在调用函数的时候对号入座。
那么extern "C"的作用,就是“提示”(为什么说提示,而不是“命令”呢,下面会分析)编译器,下面的文件和函数,要用C语言的命名规则进行。
所以加入要在A.cpp中使用C语言的B.lib库文件中的在xx.h中定义的导出函数CFun(),需要这么做。
1.首先将这个库文件链接到我们的工程中。
2.声明
extern "C"
{
#include "abc.h"
extern void CFun();
}
3.然后就可以使用 CFun();
但是我发现,有时候不使用extern "C"的方式(而是直接#include ""....)也可以使用这类函数,原因我分析如下:
1.那个库文件并不是纯正的C语言下环境下编译而成的(具体是环境是在.c文件中使用了C++中的关键字)。
2.extern "C"只是一种“提示”,而不是强制性命令编译器,具体是要不要用C语言规则,让编译器自己去判断。
后记:
今天和一个资深工程师讨论,得出如下解释。
1.在C语言的库文件中,"abc.h"包含如下定义:
#ifdef __cplusplus //在C++编译环境下
extern "C"
{
#endif
也就是说,在"abc.c"中 #include "abc.h"进行编译的时候,#ifdef __cplusplus并不会生效,因为当前是C语言的编译环境。
而在外部"abc.cpp"中 #include "abc.h" #ifdef __cplusplus就会生效了,所以可以用C语言的方式进行编译。
不得不说,这是一个很好的技巧。这样,在外部使用这个C语言的库的时候,不管是C还是C++的编译环境,都可以直接
#include "abc.h" 然后调用里面的函数了。
看来是我的水平太低了,欣赏不了别人的代码,还差点误解了前辈。
答案就是C++语言为了支持重构(重构的特征:相同的范围、相同的名字、不同的参数),在编译时对函数的命名方式进行了改变,编译后的名字包括一些参数的信息,这样才能在调用函数的时候对号入座。
那么extern "C"的作用,就是“提示”(为什么说提示,而不是“命令”呢,下面会分析)编译器,下面的文件和函数,要用C语言的命名规则进行。
所以加入要在A.cpp中使用C语言的B.lib库文件中的在xx.h中定义的导出函数CFun(),需要这么做。
1.首先将这个库文件链接到我们的工程中。
2.声明
extern "C"
{
#include "abc.h"
extern void CFun();
}
3.然后就可以使用 CFun();
但是我发现,有时候不使用extern "C"的方式(而是直接#include ""....)也可以使用这类函数,原因我分析如下:
1.那个库文件并不是纯正的C语言下环境下编译而成的(具体是环境是在.c文件中使用了C++中的关键字)。
2.extern "C"只是一种“提示”,而不是强制性命令编译器,具体是要不要用C语言规则,让编译器自己去判断。
后记:
今天和一个资深工程师讨论,得出如下解释。
1.在C语言的库文件中,"abc.h"包含如下定义:
#ifdef __cplusplus //在C++编译环境下
extern "C"
{
#endif
也就是说,在"abc.c"中 #include "abc.h"进行编译的时候,#ifdef __cplusplus并不会生效,因为当前是C语言的编译环境。
而在外部"abc.cpp"中 #include "abc.h" #ifdef __cplusplus就会生效了,所以可以用C语言的方式进行编译。
不得不说,这是一个很好的技巧。这样,在外部使用这个C语言的库的时候,不管是C还是C++的编译环境,都可以直接
#include "abc.h" 然后调用里面的函数了。
看来是我的水平太低了,欣赏不了别人的代码,还差点误解了前辈。
相关文章推荐
- C++中调用C语言库文件
- C/C++(3)C++调用C语言的函数和头文件
- 四种读写文件的方式:系统调用(open/read/write),C语言(fopen,fgets, fputs),C++(ifstream, ofstream getline,)泛型算法
- Andro 4000 id下调用c/c++程序,将c/c++程序转换成.SO文件(学习汇总篇)
- 用C/C++编写与调用动态链接库(DLL)文件
- C++调用C#的DLL文件
- C++与C调用so文件
- C语言的源文件和C++的源文件如何同时访问同一个头文件
- C++中调用bat文件
- 22.Silverlight使用WebService调用C++,Delphi编写的DLL文件
- c语言不同源文件间函数的调用
- ARM汇编 C语言 C++ 相互调用
- C语言调用exe并将结果输出到文件
- C# CLRInsideOut 托管代码与非托管代码互操作,产生相关调用代码的好工具 C++ 头文件转C# 的好工具(转
- 利用C/C++实现从文件读入到子程序中调用返回结果
- C++调用IDL导出的COM文件
- windows下C++调用shell启动和关闭可执行文件exe的最简单方法
- java调用CC++编写的DLL文件问题
- C语言调用C++库接口的方法概述
- 在window下,简单利用NDK编译c/c++文件,在android项目中调用。