typedef与define
一、typedef用法
typedef常用来定义一个标识符及关键字的别名,它生效是在语言编译过程,但它并不实际分配内存空间。typedef可以增强程序的可读性,以及标识符的灵活性,但它也有“非直观性”的缺点。举例如下:
a、先声明一个类型
- typedef (int*) pINT;
b、使用这个类型
- pINT a;
在编译的时候,定义了一个指向整型变量的指针。
二、define的用法
“#define”为宏定义语句,它在预编译时将所定义的语句展开。举例如下:
a、先定义一个宏
- #define pINT int *
b、使用这个宏
- pINT a;
在预编译阶段,将宏展开为“int *”,在编译阶段定义一个指向整型变量的指针。
三、typedef与define的区别和联系
1、 两者发生作用的时机
typedef 作用在编译阶段
define 作用在预编译阶段
2、 两者的用途
typedef
为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
define
(1) 方便程序的修改
使用简单宏定义可用宏代替一个在程序中经常使用的常量,这样在将该常量改变时,不用对整个程序进行修改,只修改宏定义的字符串即可,而且当常量比较长时, 我们可以用较短的有意义的标识符来写程序,这样更方便一些。
(2) 提高程序的运行效率
使用带参数的宏定义可完成“函数调用所完成的功能”,又能减少系统开销,提高运行效率。
3、 两者的联系
typedef能完成的功能,define也能完成,从“1、typedef用法”和“2、#define的用法”所举的例子
中可以看出。
不过,我想说的是:尽管define能完成属于typedef分内的事,但是尽量不要让define越俎代庖。
四、typedef与define区别举例
测试程序
- #include <stdio.h>
- 3 typedef int * pINT;
- 4 #define INTP int *
- 7 int main()
- 8 {
- 9 int a1;
- 10 int a2;
- 11 const pINT p1 = &a1;
- 12 const INTP p2 = &a1;
- 14 p1 = &a2;
- *p1 = a2;
- 17 *p2 = a2;
- p2 = &a2;
- return ;
- }
编译错误提示
- Compiling...
- program.cpp
- G:\C\const_test\program.cpp(14) : error C2166: l-value specifies const object
- G:\C\const_test\program.cpp(17) : error C2166: l-value specifies const object
- 执行 cl.exe 时出错.
- program.obj - error(s), warning(s)
提示的错误信息无法是说const变量,被赋予了新值,这是不允许的。
1、红色的错误(typedef引起的错误)
typedef int * pINT; 给(int *)起了一个别名pINT
const pINT p1 = &a1; 定义了一个常指针p1,并指向a1
p1 = &a2; 更改p1的指向的时候,提示错误
2、绿色的错误(define引起的错误)
#define INTP int * 定义宏INTP
const INTP p2 = &a1; 定义了一个指向常整型变量a1的指针
*p2 = a2; 更改指向整型变量a1值的时候,提示错误
3、分析所得
<1> typedef
- typedef int * pINT;
- const pINT p1 = &a1;
相当于
- int * const p1 = &a1
<2> define
- #define INTP int *
- const INTP p2 = &a1;
相当于
- const int * 或者int const *
<3> 总结
可以看到typedef对(int *)有一种包装作用,而define完全就是替换展开。
typedef与define的更多相关文章
- typedef 和 #define 的区别
本文已迁移至: http://www.danfengcao.info/c/c++/2014/02/25/difference-between-define-and-typedef.html typed ...
- typedef与#define的区别
1. typedef typedef故名思意就是类型定义的意思,但是它并不是定义一个新的类型而是给已有的类型起一个别名,在这一点上与引用的含义类似,引用是变量或对象的别名,而typedef定义的是类 ...
- typedef 和define的区别
总结一下typedef和#define的区别 1.概念 #define 它在编译预处理时进行简单的替换,不作正确性检查.它是预处理指令. typedef 它在自己的作用域内给一个已经存在的类型一个别名 ...
- typedef和#define的用法与区别
typedef和#define的用法与区别 typedef和#define的用法与区别 一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程 ...
- typedef 与define 的区别
typedef和#define的用法与区别 typedef和#define的用法与区别 一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译 ...
- typedef 优于 #define
案例一: 通常讲,typedef要比#define要好,特别是在有指针的场合.请看例子: typedef char *pStr1; #define pStr2 char *; pStr1 s1, s2 ...
- typedef和#define的区别
转自:http://www.cnblogs.com/kerwinshaw/archive/2009/02/02/1382428.html 一.typedef的用法在C/C++语言中,typedef常用 ...
- typedef和define的作用域
typedef: 如果放在所有函数之外,它的作用域就是从它定义开始直到文件尾: 如果放在某个函数内,定义域就是从定义开始直到该函数结尾: #define: 不管是在某个函数内,还是在所有函数之外,作用 ...
- typedef和define具体的具体差别
1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,仅仅有在编译已被展开的源程序时才会发现可能的错误并报错.比如: #define PI 3. ...
随机推荐
- 用CSS border相关属性画三角形
效果 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2l3aV9jb2Rlcg==/font/5a6L5L2T/fontsize/400/fill/I0J ...
- Chapter 2 - How to Add a sprite
Chapter 2 - How to Add a sprite 1. Add image resources 1.1add resources on win32 2. Add a sprite TIP ...
- 【NodeJs】Ctrl+C在Linux平台和Windows平台下的TCP连接中的不同表现
Linux平台:CentOS release 6.5 (Final) Windows平台:Windows 7 旗舰版 服务器端代码如下: var net = require('net'); var s ...
- 高效 jquery 的奥秘
当你准备使用 jQuery,我强烈建议你遵循下面这些指南: 1. 缓存变量 DOM 遍历是昂贵的,所以尽量将会重用的元素缓存. // 糟糕 h = $('#element').height(); $( ...
- Android 开发之自定义Dialog及UI的实现
我们在开发中,经常会自定义Dialog,因为原生的AlertDialog无法满足我们的需求,这个时候就需要自定义Dialog,那么如何自定义呢,其实不难,就是有点繁琐而已.也就是自定义一个UI的xml ...
- 可变字典 NSMutableDictionary
存到nsuesrDefault里面一个可变字典,然后用一个可变字典去接收. NSMutableDictionary *dic = [[NSUserDefaults standardUserDefaul ...
- Effective C++ 笔记一 让自己习惯C++
条款01:视C++为一个语言联邦 C++是个多重范型编程语言,一个同时支持面向过程形式.面向对象形式.函数形式.泛型形式.元编程形式的寓言. 将C++视为几个子语言: 传统C:区块.语句.预处理器.内 ...
- 开源 android
Android经典的开源项目其实非常多,但是国内的博客总是拿着N年前的一篇复制来复制去,实在是不利于新手学习.今天爬爬把自己熟悉的一些开源项目整理起来,希望能对Android开发同学们有所帮助.另外, ...
- php curl_init函数用法
原文地址:curl_init函数用法">php curl_init函数用法作者:loading 使用PHP的cURL库可以简单和有效地去抓网页.你只需要运行一个脚本,然后分析一下你所抓 ...
- tomcat中jsp编译
tomcat运行的工程中,jsp替换文件后可能不起作用.原因是jsp也是需要编译的.编译后的文件存放在tomcat/work文件夹下.如果替换不起作用,可以将work文件夹下的内容删除掉,重新启tom ...