原文
 一个常见的场景是,在主函数之前把一些函数注册到映射里,这些函数和某些键关联.
映射<串, 函数<整(整)>> 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";
}
至此完成在主函数前的自动注册.