递归宏的应用
在写一个项目的时候,遇到了这么一个场景:需要定义若干个字符串,想要给他们不一样的名字,但又想通过数组顺序处理。因此得出如下结构的代码:
string inputFileName, outputFileName, QueryName, KeywordsPath, keywordDir, statisticsName, statisticsBinName;
string* FilepathArr[] = { &inputFileName, &outputFileName, &QueryName, &statisticsName , &KeywordsPath, &statisticsBinName };
但是上述代码有几个小问题:
1.每当需要新增一个字符串时,就要修改两个地方;
2.插入新字符串名的时候假如不注意,就会令数组中字符串的顺序和预期的不一致。
为了解决这个问题,考虑使用宏定义来减少代码的复杂度。
在最后成功写出来之前查了很多资料也调试了很多次,总结起来有几个点:
1. 宏分为对象类宏和函数类宏两种,区分这两种宏在于宏后面是否紧跟一对括号
2. 宏展开可以迭代有限次,但不是无限次。因此可以通过展开足够的次数来满足使用要求;
3. 每次宏展开只会处理某个特定的宏,然后一遍一遍扫描直到没有宏能被处理。但宏不支持自递归或间接递归,强行递归会在一两次后终止递归,展开出来的代码中将包含未展开的宏本身,如:
#define F(x, b) x, F(x, b)