C++宏的高级用法

#ifndef __GNUC__
    #error 编译器为g++,windows下,好像没有把##生成的新字符串当成一个宏处理
#endif

#define conn(x,y)    x#y
// x必须是一个字符串,使用时,conn("2",3),而不能是conn(2,3),3可以是任何类型的字符串

// ## 有两种用法,一种是字符串连接,另一种是把连接生成的字符串当成一个新的宏
// 新宏必须存在
// 用##连接中参数中包含已定义的宏时,宏不会展开

#define STR test
#define hello(x,y,z)    x##y##z

// 第一种用法
cout<<hello(1,2,3)<<endl;        // 输出 123
// 第二种用法
#define xyz 333
cout<<hello(x,y,z)<<endl;        // 即xyz这个宏必须存在,然后输出333
cout<<hello(STR,y,z)<<endl;      // STR不会展开
// 测试程序
#include <iostream>
using namespace std;

#ifndef __GNUC__
    #error 编译器为g++,windows下,好像没有把##生成的新字符串当成一个宏处理
#endif

#define conn(x,y)    x#y
// x必须是一个字符串,使用时,conn("2",3),而不能是conn(2,3),3可以是任何类型的字符串

// ## 有两种用法,一种是字符串连接,另一种是把连接生成的字符串当成一个新的宏
// 新宏必须存在
// 用##连接中参数中包含已定义的宏时,宏不会展开

#define hello(x,y,z)    x##y##z
 
int main()
{
        cout<<conn("2",3)<<endl;         // 输出 23
        // 第一种用法
        cout<<hello(1,2,3)<<endl;        // 输出 123
        // 第二种用法
        #define xyz 333
        cout<<hello(x,y,z)<<endl;        // 即xyz这个宏必须存在,然后输出333
        //cout<<hello(STR,y,z)<endl;     // STR没有展开
        return 0;
}
时间: 2024-10-07 23:48:48

C++宏的高级用法的相关文章

Visual Studio 宏的高级用法

我已经介绍了如何编写一个最简单的宏,本文将进一步介绍如何用宏来实现对代码编辑窗口控制.在本文结束的时候,你应该能自己实现如下两个功能,第一个用于对方法体进行 phase0 标记:第二个可以将当前窗口中的代码进行归类,将所有方法.属性.变量通过region进行分块. 动画演示:phase0 动画演示:设置 region 为什么使用宏 在计算机行业内,宏的出现由来已久,因为它能替代人们执行一些重复发生的简单但烦琐的事情,所以广受人们欢迎.在 Visual Studio 中也提供了进行宏编程的方法,从

#define 宏的高级用法(转)

一,宏的定义与撤销 #普通宏定义 #define PI 3.14 //编译阶段替换掉宏 #define T1 3+4 //容易产生歧义 #define T2 (3+4) //添加括号后,语义清楚 float r = 1.0; float area = PI * r * r; int a = 2* T1 #宏替换后变成 int a = 2*3+4 不符合本意 ing a = 2* T2 #红替换后变成 int a = 2*(3+4) 符合本意 #undef PI float area = PI *

iOS自动布局高级用法及纯手码约束写法

本文主要介绍几个我遇到的总结的高级用法(当然我相信肯定有不少比这还高级的). 简单的storyboard中上下左右约束,固定宽高啥的用法在这里就不做赘述了. autolayout自动布局是iOS6以后出现的,但是在开始的一段时间里大家并不怎么会用,都是一上来先勾掉.之后随着5s,iPhone6的出现屏幕多种多样.用多层if来判断尺寸已经完全hold不住了才开始学习自动布局. 在这之前有个叫自动伸缩的autoresizing属性,这个主要用于一个控件和自己父控件之间的关系.只有autolayout

#define的高级用法

=========================================================== define中的三个特殊符号:#,##,#@ =========================================================== #define Conn(x,y) x##y #define ToChar(x) #@x #define ToString(x) #x (1)x##y表示什么?表示x连接y,举例说: int n = Conn(12

#define命令的一些高级用法

=========================================================== define中的三个特殊符号:#,##,#@ =========================================================== #define Conn(x,y) x##y #define ToChar(x) #@x #define ToString(x) #x (1)x##y表示什么?表示x连接y,举例说: int n = Conn(12

jquery on高级用法

on()的高级用法 针对自己处理机制中,不仅有on方法,还有根据on演变出来的live方法(1.7后去掉了),delegate方法等等.这些方法的底层实现部分 还是on方法,这是利用了on的另一个事件机制委托的机制衍变而来的 委托机制 .on( events ,[ selector ] ,[ data ], handler(eventObject) ) 在on的第二参数中提供了一个selector选择器,简单的来描述下 参考下面3层结构 <div class="left">

Newtonsoft.Json高级用法

手机端应用讲究速度快,体验好.刚好手头上的一个项目服务端接口有性能问题,需要进行优化.在接口多次修改中,实体添加了很多字段用于中间计算或者存储,然后最终用Newtonsoft.Json进行序列化返回数据,经过分析一个简单的列表接口每一行数据返回了16个字段,但是手机APP端只用到了其中7个字段,剩余9个字段的数据全部都是多余的,如果接口返回数据为40K大小,也就是说大约20K的数据为无效数据,3G网络下20K下载差不多需要1s,不返回无效数据至少可以节约1s的时间,大大提高用户体验.本篇将为大家

&lt;06&gt;变量使用前易犯错误总结+if语句介绍及基本格式+if-else语句及嵌套+if语句的高级用法+if语句的使用注意点+arc4random_uniform 函数导入一个头文件&lt;stdlib.h&gt;+

1)变量要初始化 -1 0  ,或者1 依据程序而定 ---------------------------------- if语句介绍及基本格式 分支语句结构 1)if 格式: if(表达式/常量/变量){ 语句块1; } 原理: 1)先计算小括号中的表达式的值 真(1) 会执行 大括号中的语句 假(0) 不会执行 大括号中的语句 2) switch 1 #include <stdio.h> 2 3 int main(int argc, const char * argv[]) { 4 5

JS Replace() 高级用法(转)

在很多项目中,我们经常需要使用JS,在页面前面对前台的某些元素做做修改,js 的replace()方法就必不可少. 经常使用"ABCABCabc".replace("A","B")的同学应该会比较清楚,改语句的最终结果是BBCABC,这种方法只能替换 第一个匹配的元素.如果替换所有呢?使用正则表达式即可: "ABCABCabc".replace(/A/g,"B") 即可. 那如果想替换A的同时也可以替换a呢