原文
一个常见的场景是,在主函数
之前把一些函数
注册到映射
里,这些函数和某些键
关联.
映射<串, 函数<整(整)>> g映射;
整 注册函数(串 键, 函数<整(整)> f) {g映射.原位(移动(键), 移动(f));中 0;
}
注册函数("a", [](整 a){中 a;});整 主() {输出<<g映射.大小()<<"\n";
}
在clang
下编译
会报错:错误:对所有声明C++
要求类型区分符
,意思是需要一个声明类型
.
如果改一下
代码,就能编译
过了
整 a = 注册函数("a", [](整 a){中 a;});
整 主() {输出<<g映射.大小()<<"\n";
}
这样就能编译过了,但是如果要注册多个函数
时就比较麻烦了
整 a = 注册函数("a", [](整 a){中 a;});
整 b = 注册函数("b", [](整 a){中 a;});
整 c = 注册函数("c", [](整 a){中 a;});
整 主() {输出<<g映射.大小()<<"\n";
}
如果是在某个头文件
里调用的该注册函数
,然后多个c++
文件包含了该头文件
,就会有重复定义
全局变量的错误.
是否可给这些变量
一些全局唯一的名字
呢,那样就不会报重定义的错误
了,是可以的,但是手写
这些变量也会很麻烦,应该自动生成
该唯一变量的名字
.
可借助宏来生成
该唯一的变量名
:
#定义 宏连(A, B) 宏连1(A, B)
#定义 宏连1(A, B) A##_##B
#如定义 _微软版本
#定义 序化库独立变量(串) 宏连(串, __计数器__)
#异
#定义 序化库独立变量(串) 宏连(串, __行__)
#结束如果
//添加了个`独特标记`.整 序化库独立变量(主) =注册函数("a", [](整 a){中 a;});
这里通过宏自动
生成了肯定是全局唯一
的由唯一
的文件名和行号
组成的唯一的文件名
.
再借助内联变量
就可解决不同c++
文件包含全局变量
重复定义的问题
了.
内联 整 序化库独立变量(主)=注册函数("a", [](整 a){中 a;});
内联 整 序化库独立变量(主)=注册函数("b", [](整 a){中 a;});
内联 整 序化库独立变量(主)=注册函数("c", [](整 a){中 a;});
整 主() {断定(g映射.大小()==3);输出<<g映射.大小()<<"\n";
}
如果担心调用
太长,可再借助一个宏
简化一下
#定义 注册函数2(文件, 键, 函数) \内联 自动 序化库独立变量(文件) = 注册函数(键, 函数);注册函数2(主, "d", [](整 a){中 a;});
注册函数2(主, "e", [](整 a){中 a;});
整 主() {输出<<g映射.大小()<<"\n";
}
至此完成在主函数
前的自动注册.