C/C++中的宏相关操作

发布时间 2023-12-26 15:28:42作者: FreeCheng

C++中的宏具有一些高级用法,以下是其中的一些:

  1. 可变参数宏:使用...;表示可变参数,在宏里对可变参数进行操作。比如使用 __VA_ARGS__ 来代表可变参数。

  2. 字符串拼接:使用 # 操作符,可以将参数转换为字符串。例如,#define STRINGIFY(x) #x 可以将 x 转换为字符串。

  3. 标记连接:使用 ## 操作符,将两个标记连接成一个标记。

  4. 条件编译:使用 #ifdef#ifndef#if#else#elif 和 #endif 等预处理指令实现条件编译

  5. 宏与函数结合:宏能够实现函数所做的一些工作,但它们是在编译时处理的,因此它们可能会引入一些副作用和安全隐患。

  6. 调试信息输出:通过宏可以在开发调试阶段输出额外的信息,而在发布版本中禁用这些信息,以提高程序运行效率。

  7. 模板元编程:在一定程度上,宏能够模拟一些元编程的行为,例如通过递归定义来展开出一系列相似的代码。

需要注意的是,宏的高级用法往往会使代码变得晦涩难懂,也可能因为缺乏类型安全性而引起问题。在实际编码中,应当慎重考虑是否使用宏以及如何使用宏,以避免引入不必要的复杂性和潜在的错误。

 


另外,在宏定义的时候,如果涉及到可变参数,最好需要在__VA_ARGS__的前面加上运算符## 主要作用是将宏参数与其他符号连接在一起。当可变参数 __VA_ARGS__ 是空的时候,如果没有 ## 运算符,当宏展开时可能会导致额外的逗号出现,从而破坏代码的语法结构。由于这种行为可能导致预期之外的问题,C/C++标准中引入了 ## 运算符来处理这种情况。

参考:整理:C/C++可变参数,“## __VA_ARGS__”宏的介绍和使用_##__va_args__-CSDN博客

这个特性也和编译器相关,有资料显示MSVC中可以不用加##,而GCC的编译对##加与不加的情况有区分,详见这篇博客评论区:#、##、__VA_ARGS__的使用-CSDN博客