最近项目中要用一个获取文件的摘要算法接口,我用标准C写出来之后,自己测试没问题题后交给了同事,结果他把我的文件包含到他的工程后发现无法编译,我过去一看才发现人家的是cpp工程,晕,按照以往的经验,在头文件的方法声明中加了一句extern "C"
#ifndef XXX
#define XXX
#include <stdio.h>
...
extern "C" void mymethod();
...
#endif
还是不行,没道理啊,查了一下资料明白了,我的改动确实是不对的,c++中引用c的方法和c中引用c++中的方法是不一样的
先说第一种情况,c++中引用c中的方法
假设c的程序包含文件a.h/a.c, c++文件是b.cpp,那么b.cpp中在包含a.h时应该这么写:
extern "C"
{
#include "a.h"
}
第二种情况c中引用c++中的方法
假设c++文件有b.h b.cpp,c文件是a.c
b.h中声明的方法前要加上extern "C"修饰符,同时在a.c中使用该方法时这样用:extern 方法名
/* b.h中的写法 */
...
extern "C" void foo();
...
/*****************************************/
/* a.c中的写法 */
extern void foo(); /* 不能使用include "b.h" */
...
在c文件的头文件中是不能直接写extern "C",这样做gcc编译器是不允许的.当然,对于第一种情况,我们更多的是使用如下的方式
#ifndef MY_H
#define MY_H
...
#ifdef __cplusplus
extern "C" {
#endif
method list
#ifdef __cplusplus
}
#endif
#endif
刚才不是说c的头文件里不能用extern "C"吗?这时你如果用g++编译器进行编译就没有问题了^_^