Debug_Info跨平台动态库头文件

    现在该根据设计文档开始写我的头文件了,他的功能主要是实现向外提供我的动态库的方法接口,尤其明确的是,不想外提供的内容,一定不要再头文件里面写。比如内部的调用的函数,这是一个误区。往往我们会一股脑的把所有的方法统统写出来,认为这是一个定义文件,而其实,他是一个供外部调用的文件。越简练越好。

    重要的部分介绍一下吧:

1、定义头文件标记,我喜欢叫他开关。我是跟一些高手学习来的,这样可以自由控制你的头文件引用。

  

#ifndef __DEBUG_INFO_HEADER__
#define __DEBUG_INFO_HEADER__

#endif

 

2、这一部分是我之前没有用的,结果在调用动态库的时候出现了问题,具体的含义是

    __declspec(dllexport)   声明一个导出函数,一般用于dll中 
    __declspec(dllimport)   声明一个导入函数,一般用于使用某个dll中 

    __stdcall是函数调用约定的一种,函数调用约定主要约束了两件事:参数传递顺序;调用堆栈由谁(调用函数或被调用函数)清理。

    现在应该明白了吧,但是这仅仅限制在Windows系列平台下,在类Unix平台下是不需要的。此外,将这些内容定义为条件编译是为了让编译和调用时区分开来。在编译动态库时,要添加__DEBUG_INFO_API_EXPORTS宏定义。添加宏定义有好多方法,一种是在增加编译时的宏定义,另一种是在编写CMake文件时添加,原理是一样的。这个会在接下来的CMake编译CMakeLists.txt文件时详细说明。

  

#ifdef WIN32
#include
<windows.h>
#ifdef __GSDB_DEBUG_INFO_API_EXPORTS
#define DllAPI __declspec(dllexport)
#else
#define DllAPI __declspec(dllimport)
#endif

#ifndef STDCALL
#define STDCALL __stdcall
#endif
#else
#define DllAPI
#define STDCALL
#endif

 

3、定义错误类别,枚举类型,相信大家应该知道这是什么原因吧。

typedef enum {
CATEGORY_SHUTDOWN
= 0x00000000,
CATEGORY_FATAL_ERROR
= 0x00000001,
CATEGORY_ERROR
= 0x00000002,
CATEGORY_WARN
= 0x00000004,
CATEGORY_AUDIT
= 0x00000008,
CATEGORY_TRACE
= 0x00000010,
CATEGORY_INFO
= 0x00000020
} debug_info_category;

 

4、定义模块类型,同样为枚举类型了

 

typedef enum {
MODULE_ALL
= 0xFFFFFFFF,
MODULE_NONE
= 0x00000000,
MODULE_SERVER
= 0x00000001,
MODULE_GSSYS
= 0x00000002,
MODULE_GSDB
= 0x00000004,
MODULE_SQL_PARSE
= 0x00000008,
MODULE_ENCRYPT
= 0x00000010,
MODULE_SECURITY
= 0x00000020
}debug_info_module;

 

5、接下来这个就有意思了,是用于C++编译器的,__cplusplus是内部定义的一个宏,具体为什么这样,文章实在是多啊,不在赘述了。

 

#ifdef __cplusplus
extern "C"
{
#endif

 

6、然后是三个接口了,就不在介绍了。 


 

DllAPI int STDCALL
debug_info_init(
const int _category, const int _modual, const char *_pathdir);


DllAPI
int STDCALL
debug_info_rec(
const int _cat,
const int _code,
const int _module,
const char* _file,
const char* _func,
const int _line,
const char* _format,
...);


DllAPI
int STDCALL
debug_info_fini();

7、不要忘记跟之前的对应起来啊

 

#ifdef _cplusplus
}
#endif

#endif //end __DEBUG_INFO_HEADER

 

    OK!基本上就是这样了。当然,有好多东西还是可以增加的,再次声明,仅仅是对特殊情况下的功能使用的,你完全可以自己根据实际的情况来写。另外,该内容不是为了追求全面,通用,仅仅是自己用的,供大家的参考使用。



posted @ 2011-04-03 14:29  uber_niello  阅读(455)  评论(0)    收藏  举报