一、多种语言切换时,利用宏和编译器生成函数,不用手动去写重复写;
方式一:普通方式,手写每个函数,但是函数都是重复的;在C文件中编写,当切换的语言多时候,就会很麻烦,查看不方便,需要写的函数也越多;如果想要移入到头文件中,那么函数需要在 __inline
后面加入 static
,const char * Text_Table
需要在 const
前面加入 satic
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| /*语言切换变量*/ int language = 0;
/*支持语言种类 最多支持两种 0: 中文、 1:英语*/ #define LANGUAGE_MAX 2
/* 文字表 */ const char * Text_Table[] = { "图片", "image", "加载框", "Load Box", "设置", "set up", "测试", "test", "语言", "language",//如果要添加新的词语,那么要在这里也添加 };
/*图片*/ __inline const char * language_image(void) { if(language>= LANGUAGE_MAX) { return *(Text_Table+(0*LANGUAGE_MAX)); } switch(language) { case 0: return *(Text_Table+(0*LANGUAGE_MAX)); case 1: return *(Text_Table+(0*LANGUAGE_MAX)+1); case 2: default: return NULL; } }
__inline const char * language_LoadBox(void) { if(language>= LANGUAGE_MAX) { return *(Text_Table+(1*LANGUAGE_MAX)); } switch(language) { case 0: return *(Text_Table+(1*LANGUAGE_MAX)); case 1: return *(Text_Table+(1*LANGUAGE_MAX)+1); case 2: default: return NULL; } }
__inline const char * language_setup(void) { if(language>= LANGUAGE_MAX) { return *(Text_Table+(2*LANGUAGE_MAX)); } switch(language) { case 0: return *(Text_Table+(2*LANGUAGE_MAX)); case 1: return *(Text_Table+(2*LANGUAGE_MAX)+1); case 2: default: return NULL; } } //如果还要添加其他的词语,那么就要在下面添加对应的函数
|
方式二:当切换的语言多时候,让宏自动生成函数,而且维护方便;如果想要移入到头文件中,那么函数需要在 __inline
后面加入 static
,const char * Text_Table
需要在 const
前面加入 satic
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| /*语言切换变量*/ int language = 0;
/*支持语言种类 最多支持两种 0: 中文、 1:英语*/ #define LANGUAGE_MAX 2
/* 文字表 */ const char * Text_Table[] = { "图片", "image", "加载框", "Load Box", "设置", "set up", "测试", "test", "语言", "language",//如果要添加新的词语,那么要在这里也添加 };
/** * @brief 语言表宏定义 * 添加了其他词语,只需要在这个宏后面添加即可 */ #define LANGUAGE_TABLE_DEF(TYPE) \ TYPE(language_image,0) \ TYPE(language_LoadBox,1) \ TYPE(language_setup,2) \ TYPE(language_test,3) \ TYPE(language_language,4)
/** * @brief 语言模板 * */ #define LANGUAGE_TEMPLATE(name,value) \ __inline const char * name(void) \ { \ if(language>= LANGUAGE_MAX) \ { \ return *(Text_Table+(value*LANGUAGE_MAX)); \ } \ \ switch(language) \ { \ case 0: \ return *(Text_Table+(value*LANGUAGE_MAX)); \ case 1: \ return *(Text_Table+(value*LANGUAGE_MAX)+1); \ case 2: \ default: \ return NULL; \ } \ \ }
/** * @brief 语言表实例化 * */ LANGUAGE_TABLE_DEF(LANGUAGE_TEMPLATE)
|
方式三:当只有两种语言的时候,那么只需要如下设置,编译器可能会优化,速度更快;如果想要移入到头文件中,那么函数需要在 __inline
后面加入 static
,const char * Text_Table
需要在 const
前面加入 satic
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| /*语言切换变量*/ int language = 0;
/** * @brief 语言表宏定义 * 添加了其他词语,只需要在这个宏后面添加即可 */ #define LANGUAGE_TABLE_DEF(TYPE) \ TYPE(language_image, "图片", "image") \ TYPE(language_LoadBox, "加载框", "Load Box") \ TYPE(language_setup, "设置", "set up") \ TYPE(language_test, "测试", "test") \ TYPE(language_language, "语言", "language")
/** * @brief 语言模板 * */ #define LANGUAGE_TEMPLATE(name,ch,en) \ __inline const char * name(void) \ { \ return language ? en:ch; \ }
/** * @brief 语言表实例化 * */ LANGUAGE_TABLE_DEF(LANGUAGE_TEMPLATE)
|
注意:当程序空间足够的时候加入 __inline ,空间不足的时候,删除掉 __inline