当前位置: 首页 > article >正文

C++ #和##的用法

作者:令狐掌门
技术交流QQ群:675120140
csdn博客:https://mingshiqiang.blog.csdn.net/


在C++中,### 是预处理器宏中的特殊符号,分别用于字符串化操作和连接符操作。下面是它们的详细用法和示例代码。


1. # 符号:字符串化操作

# 符号用于将宏参数转换为字符串。字符串化操作的结果是宏参数内容的字符串形式。

代码示例

#include <iostream>

// 定义宏,使用 # 将参数转换为字符串
#define TO_STRING(x) #x

int main() {
    int num = 42;

    // 使用宏将参数转换为字符串
    std::cout << "The name of variable: " << TO_STRING(num) << std::endl;
    std::cout << "The result of expression: " << TO_STRING(1 + 2 * 3) << std::endl;

    return 0;
}

输出结果:

The name of variable: num
The result of expression: 1 + 2 * 3

说明

  • TO_STRING(num) 会将 num 转换为字符串 "num"
  • TO_STRING(1 + 2 * 3)1 + 2 * 3 转换为字符串 "1 + 2 * 3"

2. ## 符号:连接操作

## 符号用于将宏参数与其他内容连接起来,形成一个合法的标识符。

代码示例

#include <iostream>

// 定义宏,使用 ## 将两个参数拼接
#define CONCAT(a, b) a##b

int main() {
    int xy = 100;

    // 使用宏将两个参数拼接
    std::cout << "Value of xy: " << CONCAT(x, y) << std::endl;

    return 0;
}

输出结果:

Value of xy: 100

说明

  • CONCAT(x, y) 会将 xy 拼接成 xy,从而访问变量 xy 的值。

3. 结合 ### 的高级示例:宏实现函数

使用宏结合 ### 可以创建简化的函数宏,甚至实现一些基础函数功能。

示例1:宏实现打印函数

#include <iostream>

// 定义宏,实现简单的打印函数,使用 # 转换参数名为字符串
#define PRINT_VAR(x) std::cout << #x << " = " << x << std::endl

int main() {
    int a = 10;
    float b = 3.14;

    // 调用宏打印变量的名字和值
    PRINT_VAR(a);
    PRINT_VAR(b);

    return 0;
}

输出结果:

a = 10
b = 3.14

说明

  • PRINT_VAR(a) 使用 #xa 转换为字符串 "a",然后输出变量名和值。

示例2:宏实现函数定义(利用 ##

使用 ## 连接符可以拼接函数名,动态定义函数。

#include <iostream>

// 使用宏定义一系列打印函数,拼接不同的数据类型
#define DEFINE_PRINT_FUNC(type) \
    void print_##type(type value) { std::cout << "Value: " << value << std::endl; }

DEFINE_PRINT_FUNC(int)      // 定义 print_int 函数
DEFINE_PRINT_FUNC(float)    // 定义 print_float 函数
DEFINE_PRINT_FUNC(double)   // 定义 print_double 函数

int main() {
    print_int(42);
    print_float(3.14f);
    print_double(2.718);

    return 0;
}

输出结果:

Value: 42
Value: 3.14
Value: 2.718

说明

  • DEFINE_PRINT_FUNC(int) 会生成 void print_int(int value) 函数。
  • ##print_type 拼接在一起,形成新的函数名(如 print_int)。

小结

  • # 符号用于将宏参数转换为字符串,常用于打印调试或代码生成。
  • ## 符号用于将宏参数与其他内容拼接,常用于动态创建变量或函数名。

使用宏时需小心,因为宏不会进行类型检查,容易引入错误。对于复杂功能,建议使用模板和函数,但在简单场景中,### 可以提供强大的代码生成能力。


http://www.kler.cn/a/441500.html

相关文章:

  • leetcode_链表 21.合并两个有序链表
  • springboot 配置redis
  • sentinel微服务保护
  • Qt Creator 15.0.0如何更换主题和字体
  • C#,入门教程(06)——解决方案资源管理器,代码文件与文件夹的管理工具
  • FortiGate配置远程拨号VPN
  • 【C++算法】45.分治_快排_数组中的第K个最大元素
  • Linux Nice 优先级功能解析
  • vscode无密码远程登录,不用输密码
  • 2024-2030全球与中国AI养猪解决方案市场现状及未来发展趋势
  • Flutter:页面中触发点击事件,通过id更新特定视图
  • Unreal的Audio::IAudioCaptureStream在Android中录制数据异常
  • 31.攻防世界php_rce
  • 被裁20240927 --- YOLO 算法
  • MFC 自定义网格控件
  • 解锁动态规划的奥秘:从零到精通的创新思维解析(1)
  • 解决 OpenCV 与 FFmpeg 版本不兼容导致的编译错误
  • RabbitMQ消息队列的笔记
  • Kafka篇之参数优化进而提高kafka集群性能
  • 【OpenCV计算机视觉】图像处理——平滑
  • DeepSeek-AI 开源 DeepSeek-VL2 系列,采用专家混合(MoE)架构,重新定义视觉语言人工智能
  • PyTorch中apex的安装方式
  • STT语音识别转文字工具 - 离线运行的本地语音识别服务
  • AI Agent与MEME:技术与文化融合驱动Web3创新
  • keepalive的高可用集群
  • k8s kubernetes