常规用法不再介绍,做如下几点说明和介绍

1. 带参数的宏只完成简单字符替换,之前不做计算实参的工作,如下

#define SUM(x,y) x+y

int a=3,b=2,c=1;
int s;
s=SUM(a+b,b)*SUM(c,b)+c;

结果应该是 s=a+b+b*c+b+c=10。

2. define中的特殊标识符

#define Conn(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x

int a=Conn(12,34);
char b=ToChar(a);
char c[]=ToString(a);

结果是 a=1234,c='a',c="1234";

可以看出 ## 是简单的连接符,#@用来给参数加单引号,#用来给参数加双引号即转成字符串。

更神奇的是

#define x(s) #s
   char *s = x(a   b/**/ c);
char *p = x(a/nb);

结果是*s="a  b  c",*p="a//nb",#s果然很厉害

3.define的多行定义

define可以替代多行的代码

#define MACRO(arg1, arg2) do { 
stmt1; 
stmt2; 
} while(0) 

关键是要在每一个换行的时候加上一个"/"

由此联想到了C中的关于字符串的一些默认规则

char s1[]="abc"  "efg";
char s2[]="abc"
"efg";
char s3[]="ab/
c";
char s4[]="ab
c";

其中只有s4会产生编译错误,s1="abcefg",s2="abcefg",s3="abc"

4. 宏调用顺序

#define A 3
#define B 4
#define AB 5
#define Conn(x,y) x##y

int a=Conn(A,B);

结果是a=5;可见一个宏的参数是另一个宏,先替换外面的宏,后替换参数。即Conn(A,B)=>AB,后AB=>5

5.解决重复定义的问题
由于头文件包含可以嵌套,那么C文件就有可能包含多次同一个头文件,就可能出现重复定义的问题的。
通过条件编译开关来避免重复包含(重复定义)
例如
#ifndef __headerfileXXX__
#define __headerfileXXX__

文件内容

#endif

C++中特殊的宏定义的更多相关文章

  1. Makefile中的特殊宏定义以及实用选项

    Makefile中的一些特殊宏定义的名字跟shell中的位置变量挺相似的. $?    当前目标所依赖的文件列表中比当前目标文件还要新的文件 $@   当前目标我名字 $<   当前依赖文件的名 ...

  2. iOS开发中的常用宏定义

    在iOS开发的过程中合理的使用宏定义能够极大提高编码的速度,下面是一些常用的宏定义,部分内容来自互联网 Log // 调试状态, 打开LOG功能 #ifdef DEBUG #define GLLog( ...

  3. 关于malloc源码中的bin_at宏定义的个人见解

    0x01:简介 在堆中的内存申请和释放中,为了减少使用系统调用函数对内存操作,malloc_state(分配区)结构中使用了fastbinsY数组和bins数组.当chunk被free后,bins链会 ...

  4. C中的空宏定义,即只有一个参数

    空宏定义的测试代码 #include <stdio.h> #define D(x) int main() { D(printf("null macro")); retu ...

  5. iOS中常用的宏定义

    转自http://www.jianshu.com/p/be00c3f3cafd //字符串是否为空 #define kStringIsEmpty(str) ([str isKindOfClass:[N ...

  6. iOS 静态库中使用宏定义区分iPhone模拟器与真机---备用

    问题描述 一般项目中,可以使用宏定义来判断模拟器还是真机,这无疑是有效的. #if TARGET_IPHONE_SIMULATOR #define SIMULATOR 1 #elif TARGET_O ...

  7. C语言中的宏定义

    目录(?)[-] 简单宏定义 带参数的宏 运算符 运算符 宏的通用属性 宏定义中圆括号 创建较长的宏 较长的宏中的逗号运算符 宏定义中的do-while循环do 空操作的定义 预定义宏 C语言中常用的 ...

  8. c 语言中宏定义和定义全局变量的区别

    宏定义和定义全局变量的区别: 1 作用时间不同. 宏定义在编译期间即会使用并替换,而全局变量要到运行时才可以. 2 本质类型不同. 宏定义的只是一段字符,在编译的时候被替换到引用的位置.在运行中是没有 ...

  9. 完美单例宏定义(兼容ARC和MRC),项目中可以直接使用

     单例模式: 1.永远只分配一块内存来创建对象 2.提供一个类方法, 返回内部唯一的一个对象(一个实例) 3.最好保证init方法也只初始化一次 写一个宏定义文件,传入宏定义函数名,自动生成符合类名的 ...

随机推荐

  1. React Native 组件之TouchableHightLight

    TouchableHighlight 这个组件一般是用于封装视图 给视图添加事件“触摸按下”(类似于click事件) <TouchableHighlight onPress={this._onP ...

  2. React Native的SliderIOS滑块组件

    import React,{Component}from 'react'; import { AppRegistry, StyleSheet, Text, View, SliderIOS, } fro ...

  3. ng-model 数据不更新 及 ng-repeat【ngRepeat:dupes】错误

    一.ng-include 引入的文件中 ,ng-model 数据不更新 例如, $scope.username = “Jones”  .此时,在 ng-include 引入的文件中,直接使用 ng-m ...

  4. Excel表格的导入导出

    Excel文件的组成: 01.一个Excel文件由N个Sheet组成的 02.一个Sheet由N个Row组成 03.一个Row由N个Cell组成 需求: 把内存中的数据 写入到指定的excel表格中! ...

  5. MyEclipse2014 优化设置

    1.指定本机java环境 Windows-->preferences-->java-->Insetallel JREs 右侧 单击ADD standard VM-->Next ...

  6. QString 编码转换

    参考网址:http://blog.csdn.net/lfw19891101/article/details/6641785 (网页保存于:百度云CodeSkill33 --> 全部文件 > ...

  7. 《剑指offer》第十二题(矩阵中的路径)

    // 面试题:矩阵中的路径 // 题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有 // 字符的路径.路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左.右. // 上.下移动 ...

  8. js 转义

    1. JavaScript 特殊字符 2. 正反斜杠互相替换 'a/b/c'.replace(/\//g,'\\')      //  "a\b\c" $0.value.repla ...

  9. 解决RDP连接不上

    1,开始->运行 regedit 删除注册表项目:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft, 删除MSLicensing.2,开始--运行 mstsc /v:( ...

  10. Python - PIL-pytesseract-tesseract验证码识别

    N天前实现了简单的验证识别,这玩意以前都觉得是高大上的东西,一直没有去研究,这次花了点时间研究了一下,当然只是一些基础的东西,高深的我也不会,分享一下给大家吧. 关于python验证码识别库,网上主要 ...