C++宏定义中的 # 和 ## 指令

本文深入解析了C++预处理器中的#和##操作符的使用方法及区别。#操作符用于字符串化宏参数,而##操作符则用于合并两个参数为一个新的标识符。通过具体实例,展示了如何利用这两个操作符进行复杂的宏定义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1) #:构串操作符

#是“字符串化”的意思。出现在宏定义中的#是把跟在后面的参数转换成一个字符串。
构串操作符#只能修饰带参数的宏的形参,它将实参的字符序列(而不是实参代表的值)转换成字符串常量。

#define WARN_IF(EXP) \
       { if (EXP)  fprintf(stderr, "Warning: " #EXP " found.\n");}

//测试例子

    char *pErrorInfo1 = NULL;
    char *pErrorInfo2 = "error divided by 0.";
    WARN_IF(pErrorInfo1);
    WARN_IF(pErrorInfo2);

//结果输出如下:

Warning: pErrorInfo2 found.

 

2) ##:合并操作符
合并操作符##将出现在其左右的字符序列合并成一个新的标识符。

##是一个连接符号,用于把参数连在一起。

 

以下例子可以看出两者的使用区别:

#define paster( n ) printf( "iUser" #n"_ID = %d\n ", iUser##n##_ID )
所以paster(1);就是相当于 printf("iUser1_ID = %d\n",iUser1_ID);

 

参考文章:

C++中的#和##操作符

C++中的##和#的区别

### 关于C++宏定义 `EASYLOG` `EASYLOGDEBUG` 的实现细节 在C++中,是一种预处理指令,通常用于简化代码编写过程中的重复逻辑。对于日志库而言,可以用来封装复杂的日志记录逻辑,使得开发者能够以简洁的方式调用日志功能。 #### 1. **`EASYLOG` 的实现** `EASYLOG` 是一个典型的日志,其目的是为了方便用户通过指定的日志级别来记录消息。以下是可能的实现方式: ```cpp #define EASYLOG(logger, level, format, ...) \ do { \ if ((logger)->isLevelEnabled(level)) { \ (logger)->log(level, __FILE__, __LINE__, format, ##__VA_ARGS__); \ } \ } while (0) ``` - 这里的 `do { ... } while(0)` 结构是为了确保即使在复杂语境下(比如作为条件分支的一部分),也能正常工作[^3]。 - `(logger)->isLevelEnabled(level)` 检查当前日志级别是否允许记录该条日志。 - 如果允许,则调用 `(logger)->log(...)` 方法实际记录日志,传递文件名、行号以及格式化字符串等信息。 - 使用 `##__VA_ARGS__` 可以支持可变参数列表,并且当没有额外参数时不会报错。 #### 2. **`EASYLOGDEBUG` 的实现** `EASYLOGDEBUG` 通常是专门为调试目的设计的一种日志,在生产环境中可能会被禁用或者忽略掉。其实现如下所示: ```cpp #ifdef DEBUG_MODE #define EASYLOGDEBUG(logger, format, ...) \ EASYLOG((logger), DEBUG_LEVEL, "[DEBUG] " format "\n", ##__VA_ARGS__) #else #define EASYLOGDEBUG(logger, format, ...) #endif ``` - 当编译选项启用了 `DEBUG_MODE` 时,`EASYLOGDEBUG` 将会按照 `DEBUG_LEVEL` 记录带有 `[DEBUG]` 前缀的消息[^4]。 - 否则,如果未启用调试模式,则整个会被替换为空白内容,从而避免任何性能开销。 #### 3. **结合 EasyLog 库的具体应用** 假设我们已经有一个名为 `logger` 的共享指针实例指向了一个 `EasyLog` 对象,那么可以通过以下方式分别使用这两个: ```cpp shared_ptr<EasyLog> logger = LogFactory::instance()->getEasylog("SampleLogger", "./"); // 正常日志记录 EASYLOG(logger, INFO, "This is an info message with value %d.", 42); // 调试日志记录 EASYLOGDEBUG(logger, "Debugging variable: %f", 3.14); ``` 以上代码片段展示了如何利用这些快速向应用程序添加结构化的日志输出能力[^5]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值