记录两种C语言实现命令空间的方法
结构体封装
简单来说就是将某个独立的库对外封装一个统一的接口结构体structX
,外部调用时都使用structX.aaa()
来调用库中的方法。例如有一个foo
的库,要对外提供test()
方法,可在foo.h
文件中定义一个命名空间结构体namespace_foo
,结构体中定义好需要对外提供的方法成员,并在最后通过extern
关键字对外暴露结构体变量Foo
1 | /* foo.h */ |
结构体变量Foo
的定义在foo.c
文件中
1 | /* foo.c */ |
外部要调用foo
库中的函数,只需要引用foo.h
头文件后,通过形如Foo.test()
的方式就可以
1 | /* main.c */ |
如果有另外一个库goo
需要同时使用,只需要定义结构体变量Goo
时的变量名称与Foo
不同即可
利用ifdef
另一种方式是利用条件宏定义宏来重定义函数名称
1 | /* foo.c */ |
1 | /* foo.h */ |
在外部使用foo
库的函数前,需要通过宏声明NAMESPACE_FOO
,然后再引用foo.h
头文件,后续调用test()
函数就等于调用foo_test()
1 | /* main.c */ |