C++调用C函数与Extern "C"

来源:互联网 发布:淘宝禁售商品有哪些 编辑:程序博客网 时间:2024/05/18 12:02

Author: YuMaNzI

Date: 2015/04/13

---------------------------------------------------------------

在实际中,我们可能会遇到开发一个CPP的项目,而某一个模块的功能已经有现有的C实现的库可以使用的情况。在CPP中通过Include头文件+lib或其它的方式调用相应的C函数,编译时会报LNK2001 unresolved external symbol错误,即找不到头文件对应的函数体。出现这种错误的根本原因在于CPP在处理重载时对函数名做了特殊的处理。


C语言是不支持重载的,即所有函数不能重名。另一方面,C++是支持重载的,函数重名则进一步用变量区分不同的重名函数。因此对同一个简单的函数声明:

int add(int a, int b);
CPP会产生_add_int_int之类的名字,即用函数名+变量的形式支持函数的重载;而C则直接生成_add作为函数的名字。在默认的链接方式下,CPP按照自己的方式生成函数名,即认为此函数的名字是带变量类型的。后续在lib文件中按照这个名字找函数体时,由于找不到,最终返回LNK2001的错误。


为了解决这个问题,CPP提供了一个C引用的指定符号,例如在某CPP程序中要引用i_am_a_c_program.h中的函数,同时这些函数用C实现,可以通过

extern "C"{#include "i_am_a_c_program.c"}
告诉CPP的编辑器,这些函数使用C实现的,在链接阶段找它们的函数名时按照C的风格来。这样问题就解决了。

希望这些能解决你看本文之前的问题。

-------------------------------------------------------------------------------------------

以上内容部分参考:http://blog.csdn.net/jirongzi_cs2011/article/details/14091163

0 0