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

专栏导航

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

回到目录

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

相关推荐
Chen_harmony1 小时前
十九、数据在内存中的存储
c语言·开发语言
basketball6161 小时前
C 的 malloc/free 与 C++ 的 new/delete 一些区别
c语言·开发语言·c++
mmz12071 小时前
广搜题目练习(c++)
c++·算法
郝学胜-神的一滴1 小时前
Qt 高级开发 006: 架构全解 + 高效学习指南
开发语言·c++·qt·程序人生·架构
爱编码的小八嘎1 小时前
MFC深入-消息映射的实现
c语言
Vodka~1 小时前
一根网线——Windows共享网络给Linux访问互联网
linux·网络·windows
森叶2 小时前
Windows 下从 Chromium/V8 源码编译 V8 10.8.168.25
windows
我命由我123452 小时前
Visual Studio - Visual Studio 注释快捷键
java·c语言·开发语言·c++·ide·java-ee·visual studio
love530love2 小时前
ComfyUI:为什么说它是 AIGC 应用层面的集大成者?
人工智能·pytorch·windows·aigc·devops·comfyui·extensions