一、背景介绍
在我们平常开发模块过程中,尤其是大型工程,会有很多数据、函数类型的申明及初始化,在这个时期(编译期)利用好编译器所支持的语法功能,会给我们的开发带来极大的方便。应将编译器理解成一种帮助我们智能分析、生成、统计的工具和朋友,很多事情可以交给他去完成,而不是手动的去做。作为优秀的编程技术人员,是必须要熟练掌握和正确使用的,并且尽可能了解钻研它所支持的功能!
二、使用场景
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;
}
运行的结果如下:
上面也可以将省份功能函数看做是某一框架程序的库,其它应用模块或插件可以进行查询调用。