编程进阶一:编译器的特殊功能使用及借助编译时完成数据的初始化

一、背景介绍

       在我们平常开发模块过程中,尤其是大型工程,会有很多数据、函数类型的申明及初始化,在这个时期(编译期)利用好编译器所支持的语法功能,会给我们的开发带来极大的方便。应将编译器理解成一种帮助我们智能分析、生成、统计的工具和朋友,很多事情可以交给他去完成,而不是手动的去做。作为优秀的编程技术人员,是必须要熟练掌握和正确使用的,并且尽可能了解钻研它所支持的功能!

二、使用场景

1.通过enum变量在编译时期自动的帮我们统计项目的数量,然后去引用。工程主要代码如下:

//provinceDetail.h

BEGINENUM
INTERFACE(void, PROVINCE_HENAN_MgrIntroduction, (void))
INTERFACE(void, PROVINCE_HENAN_MgrQueryCapital, (void))
INTERFACE(void, PROVINCE_HENAN_MgrQueryAncientCapital, (void))
NumOfSelector(PROVINCE_HENAN_Mgr)
ENDENUM


BEGINENUM
INTERFACE(void, PROVINCE_JIANGSU_MgrIntroduction, (void))
INTERFACE(void, PROVINCE_JIANGSU_MgrQueryCapital, (void))
INTERFACE(void, PROVINCE_JIANGSU_MgrQueryAncientCapital, (void))

NumOfSelector(PROVINCE_JIANGSU_Mgr)
ENDENUM

//provinceInterface.h
#pragma once
#include <assert.h>

#undef INTERFACE
#undef BEGINENUM
#undef NumOfSelector
#undef ENDENUM

#define   BEGINENUM  enum{
#define   NumOfSelector(name) name##InterfacesNum
#define   ENDENUM  };

#define   INTERFACE(returnType,interfaceName,params) interfaceName##SEL,
#include "provinceDetail.h"


#undef INTERFACE
#undef BEGINENUM
#undef NumOfSelector
#undef ENDENUM

#define BEGINENUM
#define NumOfSelector(name)
#define ENDENUM
#define INTERFACE(returnType,interfaceName, params) \
typedef returnType (*interfaceName##SELPROTO)params;
#include "provinceDetail.h"

#define    BASE_VERSION         1
int        g_CURRENT_VERSION = 5;

extern  void* FUN_TABLE_QUERY(int provinceID, int funID);
#define FUN_PROVINCE_HENAN_MgrIntroduction (assert(g_CURRENT_VERSION>BASE_VERSION),(*(PROVINCE_HENAN_MgrIntroductionSELPROTO)FUN_TABLE_QUERY(PROVINCE_HENANSEL,PROVINCE_HENAN_MgrIntroductionSEL)))
#define FUN_PROVINCE_HENAN_MgrQueryCapital (assert(g_CURRENT_VERSION>BASE_VERSION),(*(PROVINCE_HENAN_MgrQueryCapitalSELPROTO)FUN_TABLE_QUERY(PROVINCE_HENANSEL,PROVINCE_HENAN_MgrQueryCapitalSEL)))
#define FUN_PROVINCE_HENAN_MgrQueryAncientCapital (assert(g_CURRENT_VERSION>BASE_VERSION),(*(PROVINCE_HENAN_MgrQueryAncientCapitalSELPROTO)FUN_TABLE_QUERY(PROVINCE_HENANSEL,PROVINCE_HENAN_MgrQueryAncientCapitalSEL)))

#define FUN_PROVINCE_JIANGSU_MgrIntroduction (assert(g_CURRENT_VERSION>BASE_VERSION),(*(PROVINCE_JIANGSU_MgrIntroductionSELPROTO)FUN_TABLE_QUERY(PROVINCE_JIANGSUSEL,PROVINCE_JIANGSU_MgrIntroductionSEL)))
#define FUN_PROVINCE_JIANGSU_MgrQueryCapital (assert(g_CURRENT_VERSION>BASE_VERSION),(*(PROVINCE_JIANGSU_MgrQueryCapitalSELPROTO)FUN_TABLE_QUERY(PROVINCE_JIANGSUSEL,PROVINCE_JIANGSU_MgrQueryCapitalSEL)))
#define FUN_PROVINCE_JIANGSU_MgrQueryAncientCapital (assert(g_CURRENT_VERSION>BASE_VERSION),(*(PROVINCE_JIANGSU_MgrQueryAncientCapitalSELPROTO)FUN_TABLE_QUERY(PROVINCE_JIANGSUSEL,PROVINCE_JIANGSU_MgrQueryAncientCapitalSEL)))


//province.h
#pragma once


#undef PROVIN
#define PROVIN(name) name##SEL,

#ifndef PROVIN_SELECTOR
#define PROVIN_COUNT
enum
{
    #include "provinceTempl.h"
    PROVINCOUNTS
};
#endif
#define ProvinceNum (PROVINCOUNTS)
#undef PROVIN


//provinceTempl.h

PROVIN(PROVINCE_HENAN)
PROVIN(PROVINCE_JIANGSU)
//PROVIN(PROVINCE_SHANDONG)

//main.cpp
#include "stdafx.h"
#include <iostream>
#include "provinceInterface.h"
#include "province.h"

using namespace std;

void PROVINCE_HENAN_MgrIntroduction()
{
    std::cout << "hello,this is 河南" << std::endl;
}

void PROVINCE_HENAN_MgrQueryCapital()
{
    std::cout << "省会是郑州" << std::endl;
}

void  PROVINCE_HENAN_MgrQueryAncientCapital()
{
    std::cout << "八大古中有:安阳、洛阳、开封郑州" << std::endl;
}

void PROVINCE_JIANGSU_MgrIntroduction()
{
    std::cout << "hello,this is 江苏" << std::endl;
}

void PROVINCE_JIANGSU_MgrQueryCapital()
{
    std::cout << "省会是南京" << std::endl;
}

void  PROVINCE_JIANGSU_MgrQueryAncientCapital()
{
    std::cout << "八大古中有:南京" << std::endl;
}

void* FUN_TABLE_QUERY(int provinceID, int funID)
{
    if (provinceID == PROVINCE_HENANSEL)
    {
        if (funID == PROVINCE_HENAN_MgrIntroductionSEL) return   PROVINCE_HENAN_MgrIntroduction;
        else if (funID == PROVINCE_HENAN_MgrQueryCapitalSEL) return   PROVINCE_HENAN_MgrQueryCapital;
        else if (funID == PROVINCE_HENAN_MgrQueryAncientCapitalSEL) return  PROVINCE_HENAN_MgrQueryAncientCapital;
    }
    else if (provinceID == PROVINCE_JIANGSUSEL)
    {
        if (funID == PROVINCE_JIANGSU_MgrIntroductionSEL) return   PROVINCE_JIANGSU_MgrIntroduction;
        else if (funID == PROVINCE_JIANGSU_MgrQueryCapitalSEL) return   PROVINCE_JIANGSU_MgrQueryCapital;
        else if (funID == PROVINCE_JIANGSU_MgrQueryAncientCapitalSEL) return  PROVINCE_JIANGSU_MgrQueryAncientCapital;
    }


    return NULL;
}

int main()
{
    cout << "现在可以查询"<<ProvinceNum <<"个省份的信息"<< endl;
    cout << "各自有" << PROVINCE_HENAN_MgrInterfacesNum << "条信息:" << endl;

    FUN_PROVINCE_HENAN_MgrIntroduction();
    FUN_PROVINCE_HENAN_MgrQueryCapital();
    FUN_PROVINCE_HENAN_MgrQueryAncientCapital();

    FUN_PROVINCE_JIANGSU_MgrIntroduction();
    FUN_PROVINCE_JIANGSU_MgrQueryCapital();
    FUN_PROVINCE_JIANGSU_MgrQueryAncientCapital();
    return 0;
}

运行的结果如下:

上面也可以将省份功能函数看做是某一框架程序的库,其它应用模块或插件可以进行查询调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值