1. 经常看到说明在c++中引用c的库函数要添加 exter "c"。一直没有深究过这个问题,现在理论上分下下。
C++为了标示多态,编译之后的obj文件是和C编译的文件不同的。同样的 int add(int x,int y)如果用C编译就会编译成_add,但如果是C++编译就是_add_int_int,C++编译的obj会带参数。
在C++代码中常见的应用是
#ifndef _DISTURBAPI_H
#define _DISTURBAPI_H
#include "wavestruct.h"
#ifdef _MSC_VER
#ifdef CONTROLORDER_EXPORT
#define DLLCONTROLAPI_EXPORT __declspec(dllexport)
#else
#define DLLCONTROLAPI_EXPORT __declspec(dllimport)
#endif
#else
#define DLLCONTROLAPI_EXPORT
#endif
#ifdef __cplusplus
extern "C"
{
#endif
void DLLCONTROLAPI_EXPORT confirmWavDataSend(TWavSendOver cmd); //发送录波数据接收状态命令
void DLLCONTROLAPI_EXPORT AskForWaveDataSend(TCallWaveCmd SendOrder); //启动录波命令,命令由SendOrder.CMD决定
#ifdef __cplusplus
}
#endif
#endif
#ifdef _cplusplus的应用。{}中先添加#endif,后添加 #ifdef,上次就被这个搞蒙了。。。
上面代码中表示添加动态库dllcontrolapi_exprot中的C函数。
2.C++中引入全局函数的问题。
假设a.h中有一个全局函数,bool exchange(int &x,int &y);b.h定义了一个C++的类,该类中用到了a.h中的函数,包含了a.h的头文件,main.cpp中也用到了a.h中的函数,也包含了a.h这个头文件,此时编译会报错,报错内容为exchange这个函数在2个obj中定义。不知道为什么a.h前面的宏为什么没起作用。
解决方法:将a.h中的函数改为:static bool exchange(int &x,int &y).编译通过。