关于宏定义的问题

mattuy 2018年04月11日 194次浏览

C语言中的宏定义有时候很方便,有时候也有些不便。宏最重要的性质之一就是,它是在编译的时候直接替换相应的关键字,只是简单的替换。所以用宏定义表达式时需要额外注意。

今天打算写一个函数库,然后里面的函数都是驼峰命名风格(例如funcMyFunction)的,想同时实现Pascal风格(FuncMyFunction)调用。显然把代码复制一遍定义新函数是很不明智的,体积增加,代码大量重复,维护不便等等。

于是我就打算通过定义宏来实现:

namespace A
{
    #define TestFunc testFunc
    // ......
}

但问题就来了,宏定义是无视命名空间的。

也就是说,虽然是在名空间A中定义的,但它是全局有效的。如果实际项目中包含了这个头文件,而这个项目又包含了其他库的头文件,万一有相同名称的函数就会出错,因为所有文件中的"TestFunc"都会被替换为testFunc,然后出错。虽然这个概率不大,但其实也不算太小。

想了半天也没想到完美的解决方案,不过想到两个规避的方法。

  1. 单独用一个头文件定义这些宏,然后在编译时灵活决定是否包含它(或者在头文件中设置条件编译)。
  2. 给库中的函数加上前缀,比如mylib_funcMyFunc,这样再定义宏也能很大程度上规避重复,这条可以与第一条同时进行,应该比较保险了。

这个问题意义不是很大,不过想到了也就一说。