c 宏 中 # ## @ 分别表示什么意思

1.概要

#:把变量名变成字符串

例如:

#define TO_STRING(x) #x

const char* str = TO_STRING(hello); // 这将生成 "hello"

##:链接两个变量名(这里我把输入到宏中的参数都叫变量名,并不准确,但容易理解)

#define CONCAT(x, y) x ## y

int CONCAT(part1, part2) = 42; // 这将生成 int part1part2 = 42;

2.内容

在C语言的宏定义中,### 和 @(注意,@ 在标准的C或C++宏定义中并没有特殊含义,但在某些特定环境或方言中可能有)这些符号具有特定的预处理器操作含义。不过,我将主要解释前两个在标准C/C++宏定义中的用法。

  1. #:字符串化操作符(Stringizing Operator)
    # 符号用于将其后的宏参数转换为一个字符串。这通常用于在编译时生成包含宏参数值的字符串。

    示例:

    #define TO_STRING(x) #x

    注意:# 只会影响紧随其后的一个宏参数,如果宏有多个参数,并且你想将它们都转换为字符串,你需要为每个参数都使用 #

  2. ##:连接符(Token-Pasting Operator)
    ## 符号用于连接两个标记(tokens)成一个标记。这在宏定义中特别有用,因为它允许你创建具有动态名称的变量或函数。

    示例:

    #define CONCAT(x, y) x ## y
    int CONCAT(part1, part2) = 42; // 这将生成 int part1part2 = 42;

    注意:## 操作符不能用于连接宏参数和字面字符串或数字,只能用于连接两个标记。

    另一个常见的用法是在宏中定义函数,并使用 __LINE__ 或 __FILE__ 这样的预定义宏来生成唯一的函数名或变量名,以避免重名冲突。

    示例:

    #define UNIQUE_VAR(prefix) prefix ## __LINE__
    int UNIQUE_VAR(myVar) = 0; // 这将生成类似 myVar__123 的变量名(__LINE__ 替换为实际行号)
  3. @
    在标准的C或C++中,@ 符号在宏定义中没有特殊含义。但在一些特定的环境或方言中,例如Objective-C,@ 有特殊的用途,比如用于定义类、属性、方法、协议等。但在C或C++的标准宏定义中,@ 只是一个普通的字符,没有任何特殊含义。

    如果你在某个特定的环境或方言中看到了 @ 在宏定义中的使用,那么这很可能是该环境或方言特有的扩展或约定。

3.相关链接 

c 宏 概述-优快云博客

c 用宏遍历结构体_c语言遍历结构体-优快云博客

宏可以用字符拼接一个变量名吗_c语言宏定义拼接变量名-优快云博客

c 宏的常用场景应用举例_c语言适合用宏定义的场景-优快云博客

c 宏举例-优快云博客

关于宏的理解-优快云博客

c 系统宏有多少_c 宏有哪些-优快云博客

举例 

c++ 宏 ## 使用-优快云博客

c++ 宏 试验_#define hong(5)-优快云博客

宏和typedef 结合举例-优快云博客

宏应用

用宏消除log输出的冗余逻辑_log函数怎么消除-优快云博客

c 宏应用举例_c语言宏的实例化-优快云博客

qt 用宏控制静态接口的统一 单件应用_qt宏控制-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值