博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
#define、const、typedef的差别
阅读量:5097 次
发布时间:2019-06-13

本文共 2498 字,大约阅读时间需要 8 分钟。

#define 并不是定义变量啊

#define 只是用来做文本替换的

例如:

#define Pi 3.1415926

float angel;

angel=30*Pi/180;

那么,当程序进行编译的时候,编译器会首先将 “#define Pi 3.1415926”以后的,所有代码中的“Pi”全部换成 “3.1415926”

然后再进行编译。

我查到一个讲const与#define的差别的帖子,里面谈到const与#define最大的差 别在于:前者在堆栈分配了空间,而后者只是把具体数值直接传递到目标变量罢了。或者说,const的常量是一个Run-Time的概念,他在程序中确确实 实的存在并可以被调用、传递。而#define常量则是一个Compile-Time概念,它的生命周期止于编译期:在实际程序中他只是一个常数、一个命 令中的参数,没有实际的存在。

const常量存在于程序的数据段,#define常量存在于程序的代码段。

至于两者的优缺点,要看具体的情况了。一般的常数应用,笔者个人认为#define是一个更好的选择:

i.从run-time的角度来看,他在空间上和时间上都有很好优势。

ii.从compile-time的角度来看,类似m=t*10的代码不会被编译器优化,t*10的操作需要在run-time执行。而#define的常量会被合并(在上例中T*10将被0x82取代)。

但是:如果你需要粗鲁的修改常数的值,那就得使用const了,因为后者在程序中没有实际的存在。(其实应该说修改数据段比代码段要简单^_^)。

 有关#define的用法

1.简单的define定义

#define MAXTIME 1000

程序中遇到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"
4.define
的多行定义
define
可以替代多行的代码,例如
MFC
中的宏定义(非常的经典,虽然让人看了恶心)
#define MACRO(arg1, arg2) do { \
/* declarations */ \
stmt1; \
stmt2; \
/* ... */ \
} while(0) /* (no trailing ; ) */
关键是要在每一个换行的时候加上一个
"\"
摘抄自
修补了几个
bug
5.
在大规模的开发过程中,特别是跨平台和系统的软件里,define
最重要的功能是条件编译
就是:
#ifdef WINDOWS
......
......
#endif
#ifdef LINUX
......
......
#endif
可以在编译的时候通过
#define
设置编译环境
6.
如何定义宏、取消宏
//
定义宏
#define [MacroName] [MacroValue]
//
取消宏
#undef [MacroName]
普通宏
#define PI (3.1415926)
带参数的宏
#define max(a,b) ((a)>(b)? (a),(b))
关键是十分容易产生错误,包括机器和人理解上的差异等等。
7.
条件编译
#ifdef XXX…(#else) …#endif
例如
#ifdef DV22_AUX_INPUT
#define AUX_MODE 3
#else
#define AUY_MODE 3
endif
#ifndef XXX … (#else) … #endif
8.
头文件(.h)可以被头文件或C文件包含
重复包含(重复定义)
由于头文件包含可以嵌套,那么
C
文件就有可能包含多次同一个头文件,就可能出现重复定义的问题的。
通过条件编译开关来避免重复包含(重复定义)
例如
#ifndef __headerfileXXX__
define __headerfileXXX__
文件内容
#endif

转载于:https://www.cnblogs.com/anmog/archive/2011/03/10/1979490.html

你可能感兴趣的文章
jQuery.support
查看>>
java实现的加密解密
查看>>
网页瀑布流效果实现的几种方式
查看>>
LINUX与UNIX区别在哪
查看>>
python 快速排序代码
查看>>
Python装饰器学习(九步入门)
查看>>
通信原理1
查看>>
前端基础之BOM和DOM和三个小示例(计时器、搜索框、select联动)
查看>>
错误和异常处理(7)
查看>>
TP5.0 调用bootstrap分页类显示分页
查看>>
【LeetCode】167. Two Sum II - Input array is sorted
查看>>
如何在g++中添加include文件的目录
查看>>
BlockingQueue深入解析
查看>>
网络编程
查看>>
POJ -2236 Wireless Network
查看>>
CentOS6.9安装Filebeat监控Nginx的访问日志发送到Kafka
查看>>
java把html标签字符转换成普通字符(反转换成html标签)
查看>>
CentOS 编译源码安装MySQL-5.6.16
查看>>
Mac之NSImageView的简单实用
查看>>
pulltorefresh
查看>>