编程基础:令牌粘贴指令,【##】

专栏导航

上一篇:编程基础:续行符 【\】

回到目录

下一篇: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 第一章概述

相关推荐
love530love4 小时前
LiveTalking 数字人项目 Windows 部署完全指南(EPGF 架构)
人工智能·windows·python·架构·livetalking·epgf
CryptoPP5 小时前
快速对接东京证券交易所API数据:实战指南与代码示例
开发语言·人工智能·windows·python·信息可视化·区块链
AI thought5 小时前
【转】C语言中 -> 是什么意思?
c语言·位移运算符·右移赋值·无符号整数·算术右移
cup117 小时前
[开源] Meta Assistant / 告别命令行,我为一堆 Python 脚本做了一个 Windows 任务栏的“家”
windows·python·工具·nuitka·脚本运行
小小编程路7 小时前
Python 还有容器类型互转、进制转换、字符编码转换
开发语言·windows·python
Qt程序员8 小时前
Linux RCU 原理与应用
linux·c++·内核·linux内核·rcu
qeen878 小时前
【C++】类与对象之类的默认成员函数(二)
android·c语言·开发语言·c++·笔记·学习
王老师青少年编程9 小时前
信奥赛C++提高组csp-s之搜索进阶(记忆化搜索案例实践3)
c++·记忆化搜索·方格取数·csp·信奥赛·csp-s·提高组
Titan202410 小时前
Linux动静态库
linux·服务器·c++