C++中的宏具有一些高级用法,以下是其中的一些:
-
可变参数宏:使用
...
;表示可变参数,在宏里对可变参数进行操作。比如使用__VA_ARGS__
来代表可变参数。 -
字符串拼接:使用
#
操作符,可以将参数转换为字符串。例如,#define STRINGIFY(x) #x
可以将x
转换为字符串。 -
标记连接:使用
##
操作符,将两个标记连接成一个标记。 -
条件编译:使用
#ifdef
、#ifndef
、#if
、#else
、#elif
和#endif
等预处理指令实现条件编译。 -
宏与函数结合:宏能够实现函数所做的一些工作,但它们是在编译时处理的,因此它们可能会引入一些副作用和安全隐患。
-
调试信息输出:通过宏可以在开发调试阶段输出额外的信息,而在发布版本中禁用这些信息,以提高程序运行效率。
-
模板元编程:在一定程度上,宏能够模拟一些元编程的行为,例如通过递归定义来展开出一系列相似的代码。
需要注意的是,宏的高级用法往往会使代码变得晦涩难懂,也可能因为缺乏类型安全性而引起问题。在实际编码中,应当慎重考虑是否使用宏以及如何使用宏,以避免引入不必要的复杂性和潜在的错误。
另外,在宏定义的时候,如果涉及到可变参数,最好需要在__VA_ARGS__
的前面加上运算符##
, 主要作用是将宏参数与其他符号连接在一起。当可变参数 __VA_ARGS__
是空的时候,如果没有 ##
运算符,当宏展开时可能会导致额外的逗号出现,从而破坏代码的语法结构。由于这种行为可能导致预期之外的问题,C/C++标准中引入了 ##
运算符来处理这种情况。
参考:整理:C/C++可变参数,“## __VA_ARGS__”宏的介绍和使用_##__va_args__-CSDN博客
这个特性也和编译器相关,有资料显示MSVC中可以不用加##,而GCC的编译对##加与不加的情况有区分,详见这篇博客评论区:#、##、__VA_ARGS__的使用-CSDN博客
标签:__,VA,##,ARGS,C++,参数,相关,操作 From: https://www.cnblogs.com/freecheng/p/17921547.html