原始需求是pugixml写xml时,属性存储顺序不定,需要特殊处理
实际使用中又需要进行att的顺序可配置
兼顾程序效率问题
所以定义了一个map查att数组下标
一个vector存储att列表
一个bool []存储哪些att被使用
代码实现时,bool []的长度,开始都是人工维护的,有时加了新的att,忘了改数组大小,就可能触发越界访问,程序崩溃。所以一直想找个好点的方法去定义bool[]大小
以下是解决方案
void some_function(...)
{
static bool bIni = false;
enum {att_start = __LINE__}; if (!bIni){ //属性定义的起始行
att_define_1;
...
att_define_n;bIni = true;}
enum { att_end = __LINE__, att_count = (att_end-att_start-1) };//属性定义的终止行
int bKeepAtt[att_count] = { 0 };//att_count 是编译期推算出来的常量,此处可用于定义数组大小
...
for (int i = 0; i < att_count; ++i) {
...
}
}
以上函数内定义enum,我也是瞎猜的,百度没查到相关例子(函数内enum),
结果vs2013这种较老编译期都能通过,看来cpp还有很多理解不到位。
enum无名,这个可以理解,毕竟只是为了定义常量
__LINE__这种编译期提供的宏,用处挺多的,例如写日志时输出代码行。
为了直接计算att总数,就把if等行缩减了,这个算是最后一点小障碍,一个闪念就用违反编码规范的方式解决了,非常规,此处确实没有更好的办法。
百度获得的说法是:函数内可以定义struct、class、enum…,都可以无类型名。