C++ ‘##’ 运算符使用

目录

1、基本用法

2、创建唯一标识符

3、在宏中拼接函数名

4、注意事项


C++ 中的 ## 运算符是预处理器中的一个运算符,被称为 "token-pasting" 或 "token concatenation" 运算符。它用于在宏定义中将两个标记(token)拼接在一起。以下是一些使用 ## 的示例和说明:

1、基本用法

假设你有两个标记 xy,使用 ## 运算符可以将它们拼接成一个标记 xy

#define CONCAT(a, b) a ## b

int main() {
    int xy = 10;
    std::cout << CONCAT(x, y) << std::endl;  // 输出 10
    return 0;
}

在上面的例子中,CONCAT(x, y) 将被预处理器替换为 xy,因此 std::cout << xy << std::endl; 最终输出的是变量 xy 的值。

2、创建唯一标识符

## 运算符可以用于创建唯一标识符,这在需要生成唯一变量名时非常有用,例如在调试、临时变量创建等场景中。

#define UNIQUE_VAR(base) base ## __LINE__

int main() {
    int UNIQUE_VAR(temp) = 1;   // 生成变量 temp12 (假设这行代码在文件的第 12 行)
    int UNIQUE_VAR(temp) = 2;   // 生成变量 temp13 (假设这行代码在文件的第 13 行)
    std::cout << temp12 << ", " << temp13 << std::endl; // 输出 1, 2
    return 0;
}

在上面的例子中,UNIQUE_VAR(temp) 使用了 __LINE__ 预定义宏,将行号拼接到变量名后,确保每个变量名是唯一的。

3、在宏中拼接函数名

## 运算符也可以用于拼接函数名,以实现一些高级的宏功能。
 

#include <iostream>

#define FUNCTION_NAME(func, n) func ## n

void test1() {
    std::cout << "This is test1" << std::endl;
}

void test2() {
    std::cout << "This is test2" << std::endl;
}

int main() {
    FUNCTION_NAME(test, 1)();  // 调用 test1 函数
    FUNCTION_NAME(test, 2)();  // 调用 test2 函数
    return 0;
}

在这个例子中,FUNCTION_NAME(test, 1) 被替换为 test1FUNCTION_NAME(test, 2) 被替换为 test2,因此相应的函数被调用。

4、注意事项

  1. 避免多次拼接:在一些复杂的宏定义中,如果拼接多次,可能会导致难以调试的错误。
  2. 宏参数的副作用:在使用 ## 拼接时,如果宏参数有副作用(例如函数调用或递增操作),需要特别小心。
  3. 类型安全:由于宏替换发生在编译前的预处理阶段,宏中的类型安全无法保证,容易引起潜在的错误。

总结来说,## 运算符在宏定义中非常有用,可以拼接标记、生成唯一标识符等,但使用时需要注意可能带来的复杂性和潜在问题。

相关推荐

  1. c# ?? 、?.、??=、?[]运算符使用

    2024-07-17 08:02:03       29 阅读
  2. C++ ‘##’ 运算符使用

    2024-07-17 08:02:03       21 阅读
  3. C#中使用 => 运算符的 switch 表达式

    2024-07-17 08:02:03       49 阅读
  4. c++ %运算符

    2024-07-17 08:02:03       45 阅读
  5. C++ 运算符

    2024-07-17 08:02:03       27 阅读
  6. C语言二进制常用逻辑运算符介绍与使用

    2024-07-17 08:02:03       30 阅读
  7. C系列」C 运算符

    2024-07-17 08:02:03       29 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 08:02:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 08:02:03       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 08:02:03       58 阅读
  4. Python语言-面向对象

    2024-07-17 08:02:03       69 阅读

热门阅读

  1. python3多线程用途和场景

    2024-07-17 08:02:03       20 阅读
  2. 2024年还能入局网络安全吗?

    2024-07-17 08:02:03       22 阅读
  3. 树莓派docker自制镜像

    2024-07-17 08:02:03       23 阅读
  4. React基础学习-Day06

    2024-07-17 08:02:03       22 阅读
  5. Oracle(6)什么是重做日志文件(Redo Log File)?

    2024-07-17 08:02:03       18 阅读
  6. el-table template slot-scope=“scope“ 不显示内容

    2024-07-17 08:02:03       25 阅读
  7. PICO,迷途VR?

    2024-07-17 08:02:03       24 阅读
  8. ubuntu 18 cuda 11.8 安装 vllm

    2024-07-17 08:02:03       23 阅读
  9. LLM大语言模型研究方向总结剖析

    2024-07-17 08:02:03       21 阅读
  10. 如何在SpringCloud中优雅实现服务注册与发现

    2024-07-17 08:02:03       22 阅读