#define用法

news/2024/5/18 16:05:29 标签: mfc, 编译器, 跨平台, function, c, 网络
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="htmledit_views">

1.简单的define定义

#define MAXTIME 1000

一个简单的MAXTIME就定义好了࿰c;它代表1000࿰c;如果在程序里面写

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

class="tags" href="/tags/BianYiQi.html" title=编译器>编译器在处理这个代码之前会对MAXTIME进行处理替换为1000。

这样的定义看起来类似于普通的常量定义CONST࿰c;但也有着不同࿰c;因为define的定义更像是简单的文本替换࿰c;而不是作为一个量来使用࿰c;这个问题在下面反映的尤为突出。

2.define的“函数定义”

define可以像函数那样接受一些参数࿰c;如下

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

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

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

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

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

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

#define C(x) #x
我们假设:x=1࿰c;则有:
A(1)------〉T_1
B(1)------〉'1'
C(1)------〉"1"

(这里参考了 hustli的文章)

3.define的多行定义

define可以替代多行的代码࿰c;例如MFC中的宏定义(非常的经典࿰c;虽然让人看了恶心)

#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.在大规模的开发过程中࿰c;特别是class="tags" href="/tags/KuaPingTai.html" title=跨平台>跨平台和系统的软件里࿰c;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))
关键是十分容易产生错误࿰c;包括机器和人理解上的差异等等。

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;那么C文件就有可能包含多次同一个头文件࿰c;就可能出现重复定义的问题的。
通过条件编译开关来避免重复包含(重复定义)
例如
#ifndef __headerfileXXX__
#define __headerfileXXX__

文件内容

#endif

以上只是我从网络上搜集了一些关于define的一些用法࿰c;可能还不全面࿰c;而且#define的使用本来也存在这争议࿰c;如果你对#define的用法也很有兴趣࿰c;可以来参加我们的讨论(点击下面的链接)
http://www.dingge.com/forum/dispbbs.asp?boardID=43&ID=6972&page=1

 

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

2)typedef是在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名࿰c;但是You cannot use the typedef specifier inside a class="tags" href="/tags/FUNCTION.html" title=function>function definition。

3)typedef int * int_ptr;

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

//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不可更改࿰c;但p指向的内容可更改
const PINT p ;//p可更改࿰c;但是p指向的内容不可更改。

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

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

 

本文来自CSDN博客࿰c;转载请标明出处:http://blog.csdn.net/djsl6071/archive/2007/04/02/1549539.aspx

cle>

http://www.niftyadmin.cn/n/1536207.html

相关文章

运行React项目出现Uncaught TypeError: Cannot read property ‘forEach‘ of undefined的解决方法

问题 用create-react-app工具生成react项目&#xff0c;运行时报出这个错误&#xff0c;刚开始以为生成项目过程中出现了什么错误&#xff0c;于是重新生成了很多次&#xff0c;一启动项目便报出错误&#xff0c;仔细一看错误偏向于底层代码错误&#xff0c;锁定报错的文件rea…

ALSA(lib和util)交叉编译与测试

转载于 : http://www.programgo.com/article/34692458930/ 情况简介 ALSA 是目前 Linux 系统上大量采用的音频设备库&#xff0c;通过 Alsa 架构能分离驱动和应用的开发。 Alsa 为上层提供API 的同时&#xff0c;也为下层提供了接口&#xff0c;在内核配置的时候指定“支持 Als…

图像识别技术

图像识别算法实现收藏 <script type"text/javascript"></script> <script></script> 以往的图像处理函数实现&#xff0c;多是针对图像句柄。算法实现 需要操作复杂的图像文件。 但是&#xff0c;这种方式算法实现和调试的周期比较长。为了加…

Isotig cDNA gene structure alternative splicing gene loci 表达谱

参考&#xff1a;高通量测序相关名词 Isotig 指在转录组de novo测序时&#xff0c;用454平台测序完成后组装出的结果&#xff0c;一个isotig可视为一个转录本。 Isogroup 指转录组de novo测序中&#xff0c;用454平台测序完成后组装出的结果获得的可聚类到同一个基因的转录本…

Visual C++实现二值图像处理

二值图像是一种简单的图像格式&#xff0c;它只有两个灰度级&#xff0c;即"0"表示黑色的像素点&#xff0c;"255"表示白色的像素点&#xff0c;至于如何从一幅普通的图像获得二值图像&#xff0c;请参考我近期在天极网上发表的《Visual C编程实现图像的分…

npm publish 报403错误:403 Forbidden - PUT https://registry.npmjs.org/ocean_test_npm - Forbidden

403 Forbidden - PUT https://registry.npmjs.org/ocean_test_npm - Forbidden 原因 刚注册好npm账号&#xff0c;便立即发布第一个包时便会报出错误。因为注册好账号后&#xff0c;没有在注册的邮箱中核实邮箱地址。 解决方法 到邮箱中找到Npm官网发送的邮件&#xff0c;点…

ibatis动态修改select出来的字段

今天自己做了一个测试 , 动态去select出来数据库的字段, 但是我传参数都是正确的 , 可就是无法出来结果, 返回对象NULL . 表示很郁闷 , 然后就google了一下 , 关键词 : ibatis sql select dynamic column 不得不说, google真心强大 !!! 第一条就是我想要的 . 好了 , 回到正题 …

CSS3新特性(阴影、动画、渐变、变形、伪元素等) CSS3与页面布局学习总结——CSS3新特性(阴影、动画、渐变、变形、伪元素等)...

目录 一、阴影1.1、文字阴影1.2、盒子阴影二、背景2.1、背景图像尺寸2.2、背景图像显示的原点三、伪元素3.1、before3.2、after3.3、清除浮动四、圆角与边框4.1、border-radius 圆角4.2、边框图片border-image五、变形 transform5.1、rotate()2D旋转5.2、设置原点 transform-or…