专栏导航
上一篇:编程基础:续行符 【\】
下一篇:MFC 第一章概述
本节前言
对于本节所讲解的知识,有可能,你会需要时不时地参考本专栏的其它文章。真的遇到了需要参考之前的文章的知识点,请你自行查阅。
我呢,也会提到一部分的参考课节。但是呢,你不应该依赖于我的主动提及。最好呢,你自己能够多去了解和查看本专栏目录。
我们开始。
一. 本节内容
令牌粘贴指令,也叫做参数粘贴指令,它的符号,是两个紧贴着的井号,写作【##】。它是一个预处理指令。
我们在学习 ASCII 字符与宽字符知识的时候,会用到这个指令。
同样的一个字符串,可以用 ASCII 字符来表示,也可以用宽字符来表示。下面的字符串,是一个 ASCII 字符串。
char str[30] = "Windows Program Design";
下面的字符串,是用宽字符来表示的字符串,我们将其称作 UNICODE 字符串。 UNICODE 字符串只是宽字符串的一种。但是呢,在本节,我们暂时将其视为等价概念。
wchar_t str[30] = L"Windows Program Design";
wchar_t 是宽字符数据类型,它等价于 unsigned short 。
"Windows Program Design" 和 L"Windows Program Design",从外形上看,二者并没有太大的区别。然而,它们的内存组织形式却是不同的。不带有 L 前缀的,是 ASCII 字符串,它表示一个英文字符需要一个字节。带有 L 前缀的,是 UNICODE 字符串,它表示一个英文字符,则是需要两个字节。
现在呢,我们可以来定义一个宏代码,以便,我们可以用它来表示宽字符串。
#define WIDE_STRING(x) L##x
定义了上述的东西之后,我们来使用下面的一个宏代码。
WIDE_STRING("Windows Book")
上面的代码,等价于 L##"Windows Book" 。 而令牌粘贴指令【##】的作用,是将其左右两边的东西,给拼接起来。也就是,【L##"Windows Book"】等价于【L"Windows Book"】.。
所以呢,宏代码 WIDE_STRING("Windows Book"),它等价于【L"Windows Book"】,它的作用,是定义了一个 UNICODE 字符串,字符串的内容为【Windows Book】。
同样地,WIDE_STRING("Music Club") 等价于【L"Mucis Club"】,它的作用是定义一个 UNICODE 字符串,字符串的内容为【Music Club】。
令牌粘贴指令的作用,就是将其左右两个东西,给拼接起来。
令牌粘贴指令,除了可以用来拼接宽字符前缀 L 与字符串内容之外,还可以用来拼凑一个变量。
比如说,我们可以建立下述的代码。
#include <stdio.h>
#define CALCU(cage, x, y) calcu_##cage((x), (y))
int calcu_me01(int a, int b);
int calcu_me02(int a, int b);
int main(void)
{
int res_01, res_02;
int x, y;
x = 70;
y = 60;
res_01 = CALCU(me01, x, y);
res_02 = CALCU(me02, x, y);
return 0;
}
int calcu_me01(int a, int b)
{
return (a + b);
}
int calcu_me02(int a, int b)
{
return (a - b);
}
在上述的程序代码里面,我们定义了两个函数,calcu_me01 和 calcu_me02 。这两个函数的实现代码很简单。
我们还在代码的开头部分,定义了一个宏代码 CALCU 。
其中呢,CALCU 对第一个参数的处理,就是将【calcu_】和第一个参数进行令牌粘贴处理,也就是进行拼接处理。如果,CALCU 的第一个宏参数为【me01】,则令牌粘贴的处理结果就是 calcu_me01 。所以呢,CALCU(me01, x, y) 宏代码相当于是调用了 calcu_me01(x, y),而 CALCU(me02, x, y) 相当于是执行了 calcu_me02(x, y) 函数调用。
总 结
在本节,我采用案例讲解的方式,在演示之中,讲解了令牌粘贴指令的作用。我之所以要以这种方式来讲解,是因为,我的言语表达能力并不强。所以,对这种我不太容易讲清楚的东西,采取了案例演示的方式。
希望大家能够学好本节知识。
专栏导航
上一篇:编程基础:续行符 【\】
下一篇:MFC 第一章概述