C++ 特殊宏定义

“#”的作用

将其后面的宏参数进行字符串化操作

remark:内部宏不会展开,若要使内部宏生效,需定义中间宏

“##”的作用

符号拼接

“#@”的作用

将宏参数转换为字符

示例代码

#define STRING(x) #x
#define MAKECHAR(x) #@x
#define _STRING(x) STRING(x)
#define PASTER(n) token##n
int main(int agrc,char** agrv)
{
    char* pTest = STRING(hello);
    char p = MAKECHAR(b);
    char* strFile = STRING(__FILE__);
    char* strFile1 = _STRING(__FILE__);
    printf("%s,%d\r\n",pTest,p);
    printf("%s\r\n",strFile);
    printf("%s\r\n",strFile1);
    int token10 = 199;
    printf("%d\r\n",PASTER(10));
}

输出结果:

hello,96
__FILE__
D:\test.cpp
199
### C++ 宏定义的使用方法 #### 基础概念 宏定义是一种预处理器指令,在源代码被编译之前由预处理器完成替换操作。它的主要作用是对一段代码片段进行重用或者简化复杂逻辑表达。 在 C++ 中,`#define` 是用于声明的关键字。它可以用来定义简单的常量替代、函数式的以及更复杂的多行[^1]。 --- #### 单行宏定义 最基础的形式是单行宏定义,通常用于定义常量或简单表达式: ```cpp #define PI 3.1415926 ``` 上面的例子中,每次遇到 `PI` 的地方都会被替换成数值 `3.1415926`。需要注意的是,这种形式容易引发一些潜在问题,例如括号缺失可能导致优先级错误[^3]。 为了防止此类问题发生,推荐总是加上括号来保护中的表达式: ```cpp #define SQUARE(x) ((x) * (x)) ``` 这样即使传入带有运算符的参数也不会影响最终结果。 --- #### 多行宏定义 如果需要实现较为复杂的逻辑,则可以通过 `\` 符号将扩展到多行书写。这种方式特别适合模拟小型功能模块的行为,例如交换两个变量值的操作[^1]: ```cpp #define SWAP(a, b) do { \ decltype(a) temp = (a); \ (a) = (b); \ (b) = temp; \ } while(0) ``` 这里引入了 `decltype` 关键字自动推导类型,并利用 `do...while(0)` 结构确保无论上下文中如何调用该都能正常工作(即便是在条件语句之后直接跟分号的情况)。此技巧能够有效提升代码健壮性。 --- #### 参数化 除了基本的数据替换外,还可以让接受输入参数并返回相应结果。例如分配内存时指定数量与数据类型的组合方式[^2]: ```cpp #define MALLOC(n, type) ((type*)malloc((n)*sizeof(type))) ``` 上述例子展示了如何通过快速生成特定长度数组指针的过程。注意这里的圆括号包围整个表达式部分是为了保障计算顺序正确无误。 另外值得注意的一点在于某些情况下可能希望把不同组件结合起来形成新的名字或者其他结构体成员访问路径等场景下需要用到特殊符号连接技术即所谓的“标记粘连”。 --- #### 标记粘贴 (`##`) 运算符 有时候我们需要动态构建标识符名称或其他复合型实体,这时就可以借助于 `##` 运算符来进行字符串拼接[^4] : ```cpp #define CONCATENATE(prefix, suffix) prefix ## _ ## suffix CONCATENATE(MyClass, Instance); // 展开后变为 MyClass_Instance; ``` 尽管这种方法提供了极大的灵活性,但也增加了理解难度,所以在实际项目开发过程中应当谨慎评估其必要性和适用范围。 --- #### 注意事项 虽然提供了一种强大而灵活的方式来优化和抽象代码,但它也有一些缺点: - **缺乏类型安全**:由于只是文本替换机制的一部分,它们不会像常规函数那样受到严格检查。 - **调试困难**:因为所有的展开都在编译前阶段完成,所以一旦出现问题定位起来相对麻烦些。 因此建议仅限于确实无法采用其他手段解决问题的情形下方才考虑运用工具;对于大多数情况而言,应该优先选用内联函数或是模板元编程之类更为现代化的技术方案取代传统意义上的应用模式[^4]。 --- ### 示例综合展示 以下是几个典型的应用实例汇总在一起供参考学习之用: ```cpp #include <iostream> using namespace std; // 定义一个求平方数目的 #define SQUARE(x) ((x) * (x)) // 创建一个通用性的内存申请 #define ALLOCATE_MEMORY(count, Type) ((Type *)malloc(sizeof(Type) * count)) int main(){ double radius = 7.8; // 计算圆形面积 cout << "Area of circle with r="<<radius<<": "<<SQUARE(radius)*PI<<endl; // 动态开辟整型数组空间存储十个元素 int* numbers = ALLOCATE_MEMORY(10,int); free(numbers); return 0; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值