C语言好的处理代码

一、多种语言切换时,利用宏和编译器生成函数,不用手动去写重复写;

方式一:普通方式,手写每个函数,但是函数都是重复的;在C文件中编写,当切换的语言多时候,就会很麻烦,查看不方便,需要写的函数也越多;如果想要移入到头文件中,那么函数需要在 __inline 后面加入 staticconst 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 后面加入 staticconst 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 后面加入 staticconst 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