1.简单的define定义

#define MAXTIME 1000

一个简单的MAXTIME就定义好了,它代表1000,假设在程序里面写

if(i<MAXTIME){.........}

编译器在处理这个代码之前会对MAXTIME进行处理替换为1000。

这种定义看起来相似于普通的常量定义CONST,但也有着不同,由于define的定义更像是简单的文本替换,而不是作为一个量来使用,这个问题在以下反映的尤为突出。

2.define的“函数定义”

define能够像函数那样接受一些參数,例如以下

#define max(x,y) (x)>(y)?(x):(y);

这个定义就将返回两个数中较大的那个,看到了吗?由于这个“函数”没有类型检查,就好像一个函数模板似的,当然,它绝对没有模板那么安全就是了。能够作为一个简单的模板来使用而已。

可是这样做的话存在隐患,样例例如以下:
#define Add(a,b) a+b;
在一般使用的时候是没有问题的,可是假设遇到如:c * Add(a,b) * d的时候就会出现故障,代数式的本意是a+b然后去和c,d相乘,可是由于使用了define(它仅仅是一个简单的替换),所以式子实际上变成了
c*a + b*d

另外举一个样例:
#define pin (int*);
pin a,b;
本意是a和b都是int型指针,可是实际上变成int* a,b;
a是int型指针,而b是int型变量。
这是应该使用typedef来取代define,这样a和b就都是int型指针了。

所以我们在定义的时候,养成一个良好的习惯,建议全部的层次都要加括号。

3.宏的单行定义
#define A(x) T_##x
#define B(x) #@x

#define C(x) #x
我们如果:x=1,则有:
A(1)------〉T_1
B(1)------〉'1'
C(1)------〉"1"

(这里參考了 hustli的文章)

3.define的多行定义

define能够替代多行的代码,比如MFC中的宏定义(很的经典,尽管让人看了恶心)

#define MACRO(arg1, arg2) do { /
/* declarations */ /
stmt1; /
stmt2; /
/* ... */ /
} while(0) /* (no trailing ; ) */
关键是要在每个换行的时候加上一个"/"

摘抄自http://www.blog.edu.cn/user1/16293/archives/2005/115370.shtml 修补了几个bug

4.在大规模的开发过程中,特别是跨平台和系统的软件里,define最重要的功能是条件编译。

就是:
#ifdef WINDOWS
......
......
#endif
#ifdef LINUX
......
......
#endif

能够在编译的时候通过#define设置编译环境

5.怎样定义宏、取消宏

//定义宏
#define [MacroName] [MacroValue]
//取消宏
#undef [MacroName]
普通宏
#define PI (3.1415926)

带參数的宏
#define max(a,b) ((a)>(b)? (a),(b))
关键是十分easy产生错误,包含机器和人理解上的差异等等。

6.条件编译
#ifdef XXX…(#else) …#endif
比如 #ifdef DV22_AUX_INPUT
#define AUX_MODE 3
#else
#define AUY_MODE 3
#endif
#ifndef XXX … (#else) … #endif

7.头文件(.h)能够被头文件或C文件包括;
反复包括(反复定义)
因为头文件包括能够嵌套,那么C文件就有可能包括多次同一个头文件,就可能出现反复定义的问题的。
通过条件编译开关来避免反复包括(反复定义)
比如
#ifndef __headerfileXXX__
#define __headerfileXXX__

文件内容

#endif

以上仅仅是我从网络上搜集了一些关于define的一些使用方法,可能还不全面,并且#define的使用本来也存在这争议,假设你对#define的使用方法也非常有兴趣,能够来參加我们的讨论(点击以下的链接)
http://www.dingge.com/forum/dispbbs.asp?boardID=43&ID=6972&page=1

#define和typedef的差别
 
 
1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,仅仅有在编译已被展开的源程序时才会发现可能的错误并报错。比如:
#define PI 3.1415926
程序中的:area=PI*r*r 会替换为3.1415926*r*r
假设你把#define语句中的数字9 写成字母g 预处理也照样带入。

2)typedef是在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名,可是You cannot use the typedef specifier inside a function definition。

3)typedef int * int_ptr;

#define int_ptr int *
作用都是用int_ptr代表 int * ,可是二者不同,正如前面所说 ,#define在预处理 时进行简单的替换,而typedef不是简单替换 ,而是採用如同定义变量的方法那样来声明一种类型。也就是说;

//refer to (xzgyb(老达摩))
#define int_ptr int *
int_ptr a, b; //相当于int * a, b; 仅仅是简单的宏替换

typedef int* int_ptr;
int_ptr a, b; //a, b 都为指向int的指针,typedef为int* 引入了一个新的助记符

这也说明了为什么以下观点成立
//QunKangLi(维护成本与程序猿的创造力的平方成正比)
typedef int * pint ;
#define PINT int *

那么:
const pint p ;//p不可更改,但p指向的内容可更改
const PINT p ;//p可更改,可是p指向的内容不可更改。

pint是一种指针类型 const pint p 就是把指针给锁住了 p不可更改
而const PINT p 是const int * p 锁的是指针p所指的对象。

3)或许您已经注意到#define 不是语句 不要在行末加分号,否则 会连分号一块置换。

#define使用方法的更多相关文章

  1. Unable to execute dex: Multiple dex files define 解决方法

    程序编译正常,在用Eclipse调试执行时,报错Unable to execute dex: Multiple dex files define: 方法:      原因是有重复的.jar被引用,可以 ...

  2. eclipse:运行 Android 项目时出现 “Unable to execute dex: Multiple dex files define” 解决方法

    android 项目在eclipse 出现Unable to execute dex: Multiple dex files define Conversion to Dalvik format fa ...

  3. Unable to execute dex:Multuple dex files define 解决方法

    困扰我两天的问题终于解决了,在网上查的方法无非有三种 一. Eclipse->Project->去掉Build Automatically->Clear ->Build Pro ...

  4. define定义方法

    define('a',function(){ ; return x; }); define('b',['a'],function(a){ ; return y+a; }); M.use(['b'],f ...

  5. [Android开发常见问题-11] Unable to execute dex: Multiple dex files define 解决方法

    最近在开发一个工程,其中用到了一个开源的库项目Android-ViewPagerIndicator. 这个项目是作为一个库出现的,如下图: 这个项目中包含了android-support-v4.jar ...

  6. 转:Unable to execute dex: Multiple dex files define 解决方法

    转自:http://blog.csdn.net/mxlxiao7/article/details/8978930 问题发生概述: 程序编译正常,在用Eclipse调试执行时,报错Unable to e ...

  7. IOS 基础-define、const、extern、全局变量

    这里介绍一下define.const.extern的用法.优劣以及要注意的地方. 1.define 宏define是定义一个变量,没有类型信息.define定义的常量在内存中有若干个拷贝. defin ...

  8. 为什么很多人使用#define而不是const定义常量

    众所周知,C语言一开始只有#define,C程序员用#define定义符号常量.但后来ANSI C加入了const限定符,而const应该比#define更好,为什么现在的C程序员还在大量使用#def ...

  9. C语言#和##操作符使用方法

    1.#操作符              1:#操作符用于预处理阶段,将宏参数转换为字符串,只有宏定义中使用(#define) 使用方法: #define  STRING(x)   #x printf( ...

随机推荐

  1. java解析XML四种方法

    XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML. XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便 ...

  2. ili9341 横屏驱动代码

    void ili9341_Initializtion(void) { u16 i; RCC->APB2ENR|=<<; //使能PORTB时钟 GPIOB->CRH&= ...

  3. Linux学习笔记:CentOS安装MySQL

    [1]安装版本: 1.1 CentOS-7-x86_64-Everything-1503-01    1.2 MySQL-5.6.27-1.linux_glibc2.5.x86_64.rpm-bund ...

  4. ASP.NET性能优化小结(ASP.NET&C#)

    ASP.NET: 一.返回多个数据集 检查你的访问数据库的代码,看是否存在着要返回多次的请求.每次往返降低了你的应用程序的每秒能够响应请求的次数.通过在单个数据库请求中返回多个结果集,可以减少与数据库 ...

  5. CSS 3的display:盒类型详解

    在CSS中,使用display属性来定义盒的类型.总体来说,盒类型分为两类:inline和block.如div默认是block,span默认是Inline.可以通过display修改默认的表现方式. ...

  6. MapReduce Kmeans聚类算法

    最近在网上查看用MapReduce实现的Kmeans算法,例子是不错,http://blog.csdn.net/jshayzf/article/details/22739063 但注释太少了,而且参数 ...

  7. overflow,white-space,text-overflow组合技,省略号!

    这是一个很简单的组合技,灵活应用省略号.

  8. JSF 2.0 hello world example

    In this tutorial, we will show you how to develop a JavaServer Faces (JSF) 2.0 hello world example, ...

  9. oracle merge用法

    动机: 想在Oracle中用一条SQL语句直接进行Insert/Update的操作. 说明: 在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 ,也就是说当存在记录 ...

  10. iOS异常捕获

    文章目录 一. 系统Crash 二. 处理signal 下面是一些信号说明 关键点注意 三. 实战 四. Crash Callstack分析 – 进⼀一步分析 五. demo地址 六. 参考文献 前言 ...