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

专栏导航

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

回到目录

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

相关推荐
郝学胜-神的一滴28 分钟前
中级OpenGL教程 023:Assimp模型加载全解——从源码到架构的骈文探秘
c++·unity·游戏引擎·cmake·unreal engine·opengl
天空'之城28 分钟前
C 语言工业级通用组件手写 10:字节序转换
c语言·字节序·大小端·嵌入式通信·工业级组件
星恒随风29 分钟前
C++ STL 详解:list 的使用、迭代器失效、模拟实现与 vector 对比
开发语言·数据结构·c++·笔记·学习·list
寒水馨37 分钟前
Windows 11下载、安装openclaw-v2026.7.1(附安装包OpenClawCompanion-Setup-x64.exe)
windows·大模型·开源软件·ai助手·openclaw·个人ai·中文版
牢姐与蒯41 分钟前
c++之异常
开发语言·c++·c++11
此生决int43 分钟前
深入理解C++系列(02)——类和对象(上)
开发语言·c++
sukalot1 小时前
windows网络适配器驱动开发-为多个 Windows 版本生成 WiFiCx 驱动程序
windows·驱动开发
zjun10012 小时前
C++:单例模式
c++·单例模式
同勉共进11 小时前
记一例 vibe coding + gcc bug 导致的线程池死锁问题
c++·线程池·gcc·死锁·vibe coding
我叫洋洋11 小时前
C ++ [ hello world ]
c语言·c++·算法