我们都知道C++语言兼容C语言,那么C++调用C语言库,为什么为什么需要 extern "C"的帮助?
答案就是C++语言为了支持重构(重构的特征:相同的范围、相同的名字、不同的参数),在编译时对函数的命名方式进行了改变,编译后的名字包括一些参数的信息,这样才能在调用函数的时候对号入座。
那么extern "C"的作用,就是“提示”(为什么说提示,而不是“命令”呢,下面会分析)编译器,下面的文件和函数,要用C语言的命名规则进行。
所以加入要在A.cpp中使用C语言的B.lib库文件中的在xx.h中定义的导出函数CFun(),需要这么做。
1.首先将这个库文件链接到我们的工程中。
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语言库,为什么为什么需要 extern "C"的帮助?答案就是C++语言为了支持重构(重构的特征:相同的范围、相同的名字、不同的参数),在编译时对函数的命名方式进行了改变,编译后的名字包括一些参数的信息,这样才能在调用函数的时候对号入座。 那么extern "C"的作用,就是“提示”(为什么说提示,而不是“命令”呢,下面会分析)编译器,
C
语言
和C++
语言
是项目开发
中
经常用到的
语言
,在开发过程
中
经常会遇到C++程序要
调用
C程序的场景。如果项目代码是C
语言
写的,而使用的代码测试框架是C++写的,为了测试C项目代码,自然而然就会在C++代码
中
调用
C代码写的函数。
在C++代码
调用
C代码写的函数过程
中
,遇到的最大问题就是找不到符号,具体原因是因为C
语言
和C++
语言
在生成函数符号是有差异的。
比如在foo.c的
文件
中
代码如下:
int foo(int x, int y) {
C++
调用
C
库
时,
方法一:查看C
库
的头
文件
中
有没有加extern“C”声明(应养成这个习惯,为了防止以后被C++
调用
),没有的话自己加上。
#ifdef __cplusplus //C++
中
定义的宏
extern "C"
#endif
void func(); //函数声明
#ifdef __cplusplus
#endif
方法二:如果C头
文件
没有定义extern “C”,可以在C++
调用
C头
文件
时用extern “C”将头
文件
包起来
extern “C”
#includ
1. 下载ini配置
文件
解析
库
,例如iniparser。
2. 将
库
文件
和头
文件
添加到项目
中
。
3. 在代码
中
包含头
文件
:#include "iniparser.h"
4. 打开ini
文件
:dictionary *ini = iniparser_load("config.ini");
5. 读取ini
文件
中
的值:
char *value = iniparser_getstring(ini, "section:key", "default value");
6. 关闭ini
文件
:iniparser_freedict(ini);
注意:在使用iniparser_getstring函数时,第三个参数是默认值,如果无法找到指定的section或key,则会返回默认值。