2401C++,C++自动注册

原文
一个常见的场景是,在主函数之前把一些函数注册到映射里,这些函数和某些键关联.

映射<, 函数<()>> 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";
}

至此完成在主函数前的自动注册.

相关推荐

  1. 2401C++,C++自动注册

    2024-01-12 20:58:03       40 阅读
  2. cf240-B-Mashmokh and ACM DP

    2024-01-12 20:58:03       12 阅读
  3. 编写CI/CD自动化部署脚本

    2024-01-12 20:58:03       39 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-12 20:58:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-12 20:58:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-12 20:58:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-12 20:58:03       20 阅读

热门阅读

  1. 【Android 10 适配】隐私权限变更

    2024-01-12 20:58:03       33 阅读
  2. 【计算机网络互联网路由选择协议 - RIP】

    2024-01-12 20:58:03       38 阅读
  3. C语言浮点型详解

    2024-01-12 20:58:03       36 阅读
  4. ERP管理平台—通用功能测试用例

    2024-01-12 20:58:03       40 阅读