在工作中总是会面对一些纯C的驱动程序,但是,有时候想通过一些已经熟练使用的,或者说是已经成型的代码框架中很好的模块,去配合驱动完成任务,这个时候有一个问题会出现在我们面前,就是.cpp文件需要引用纯c的函数,该怎么办?
这个时候,就需要对纯C的函数添加相应的外壳,下面我举个例子:
Driver.c文件中:
void InitHS(int Handle); ///< 举个例子的函数,并没有什么真实的意义
但是我需要用一个例如Test.cpp文件去引用这个函数,怎么办?需要进行如下处理:
Driver.c
需要修改成:
#ifdef __cplusplus
extern "C" {
#endif
void InitHS(int Handle)
#ifdef __cplusplus
}
#endif
这样的处理完成后,就可以让C++的编译器顺利的完成编译。
对于这样用法的原因:因为C++提供的重载机制,重载机制的出现,使得函数在编译过程中,并不单单是函数名那么简单,编译器本身会添加一些其他的信息,但是对于C的编译器就不会出现这种情况,因为C不支持重载,即一个函数名包括其参数列表表示一个函数,不会有歧义。
对于C++编译器, 由于__cplusplus宏被定义, 因此通过extern "C"来通知C++编译器编译后的代码是按照C的obj文件格式编译的,要连接的话按照C的命名规则去找.。
简单的说,如果使用者分不清代码会被谁调用,那么请在这段代码上添加这个外壳。