C语言中的宏定义有时候很方便,有时候也有些不便。宏最重要的性质之一就是,它是在编译的时候直接替换相应的关键字,只是简单的替换。所以用宏定义表达式时需要额外注意。
今天打算写一个函数库,然后里面的函数都是驼峰命名风格(例如funcMyFunction)的,想同时实现Pascal风格(FuncMyFunction)调用。显然把代码复制一遍定义新函数是很不明智的,体积增加,代码大量重复,维护不便等等。
于是我就打算通过定义宏来实现:
namespace A
{
#define TestFunc testFunc
// ......
}
但问题就来了,宏定义是无视命名空间的。
也就是说,虽然是在名空间A中定义的,但它是全局有效的。如果实际项目中包含了这个头文件,而这个项目又包含了其他库的头文件,万一有相同名称的函数就会出错,因为所有文件中的"TestFunc"都会被替换为testFunc,然后出错。虽然这个概率不大,但其实也不算太小。
想了半天也没想到完美的解决方案,不过想到两个规避的方法。
- 单独用一个头文件定义这些宏,然后在编译时灵活决定是否包含它(或者在头文件中设置条件编译)。
- 给库中的函数加上前缀,比如mylib_funcMyFunc,这样再定义宏也能很大程度上规避重复,这条可以与第一条同时进行,应该比较保险了。
这个问题意义不是很大,不过想到了也就一说。