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

专栏导航

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

回到目录

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

相关推荐
凡人叶枫4 小时前
Effective C++ 条款30:透彻了解 inlining 的里里外外
linux·开发语言·c++·嵌入式开发·effective c++
noipp4 小时前
推荐题目:洛谷 P10907 [蓝桥杯 2024 国 B] 蚂蚁开会
c语言·c++·算法·编程·洛谷
学逆向的4 小时前
C++纯虚函数
开发语言·c++·网络安全
caimouse4 小时前
Reactos 第 8 章 结构化异常处理 — 8.2 系统空间的结构化异常处理
windows
caimouse5 小时前
Reactos 第 7 章 视窗报文 — 7.3 Win32k 的用户空间回调机制
windows
caimouse5 小时前
Reactos 第 9 章 设备驱动 — 9.5 一组PnP设备驱动模块的实例
网络·windows
神成15 小时前
vmware 上 win7 系统按照 vmware tool
windows
凡人叶枫5 小时前
Effective C++ 条款22:将成员变量声明为 private
linux·开发语言·c++
虾壳云官方6 小时前
OpenClaw 2.7.9 Windows 一键部署教程:零基础也能搭建 AI 自动化助手
运维·人工智能·windows·自动化·openclaw·openclaw一键部署
努力小周6 小时前
STM32智能安防系统
c语言·stm32·单片机·嵌入式硬件·物联网·计算机网络·pcb工艺