Alvin

typedef 与 #define 的区别

1. 执行时间不同

关键字 typedef 在编译阶段有效,由于是在编译阶段,因此 typedef 有类型检查的功能。

#define 则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查。

【例1.1】typedef 会做相应的类型检查:

typedef unsigned int UINT;

void func()

{

UINT value = "abc"; // error C2440: 'initializing' : cannot convert from 'const char [4]' to 'UINT'

cout << value << endl;

}

【例1.2】#define不做类型检查:

// #define用法例子:

#define f(x) x*x

int main()

{

int a=6, b=2, c;

c=f(a) / f(b);

printf("%d\n", c);

return 0;

}

程序的输出结果是: 36,根本原因就在于 #define 只是简单的字符串替换。

2、功能有差异

typedef 用来定义类型的别名,定义与平台无关的数据类型,与 struct 的结合使用等。

#define 不只是可以为类型取别名,还可以定义常量、变量、编译开关等。

3、作用域不同

#define 没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。

而 typedef 有自己的作用域。

【例3.1】没有作用域的限制,只要是之前预定义过就可以

void func1()

{

#define HW "HelloWorld";

}

void func2()

{

string str = HW;

cout << str << endl;

}

【例3.2】而typedef有自己的作用域

void func1()

{

typedef unsigned int UINT;

}

void func2()

{

UINT uValue = 5;//error C2065: 'UINT' : undeclared identifier

}

【例3.3】

class A

{

typedef unsigned int UINT;

UINT valueA;

A() : valueA(0){}

};

class B

{

UINT valueB;

//error C2146: syntax error : missing ';' before identifier 'valueB'

//error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

};

上面例子在B类中使用UINT会出错,因为UINT只在类A的作用域中。此外,在类中用typedef定义的类型别名还具有相应的访问权限,【例3.4】:

class A

{

typedef unsigned int UINT;

UINT valueA;

A() : valueA(0){}

};

void func3()

{

A::UINT i = 1;

// error C2248: 'A::UINT' : cannot access private typedef declared in class 'A'

}

而给UINT加上public访问权限后,则可编译通过。

【例3.5】:

class A

{

public:

typedef unsigned int UINT;

UINT valueA;

A() : valueA(0){}

};

void func3()

{

A::UINT i = 1;

cout << i << endl;

}

4、对指针的操作

二者修饰指针类型时,作用不同。

typedef int * pint;

#define PINT int *

int i1 = 1, i2 = 2;

const pint p1 = &i1; //p不可更改,p指向的内容可以更改,相当于 int * const p;

const PINT p2 = &i2; //p可以更改,p指向的内容不能更改,相当于 const int *p;或 int const *p;

pint s1, s2; //s1和s2都是int型指针

PINT s3, s4; //相当于int * s3,s4;只有一个是指针。

void TestPointer()

{

cout << "p1:" << p1 << " *p1:" << *p1 << endl;

//p1 = &i2; //error C3892: 'p1' : you cannot assign to a variable that is const

*p1 = 5;

cout << "p1:" << p1 << " *p1:" << *p1 << endl;

cout << "p2:" << p2 << " *p2:" << *p2 << endl;

//*p2 = 10; //error C3892: 'p2' : you cannot assign to a variable that is const

p2 = &i1;

cout << "p2:" << p2 << " *p2:" << *p2 << endl;

}

结果:

p1:00EFD094 *p1:1

p1:00EFD094 *p1:5

p2:00EFD098 *p2:2

p2:00EFD094 *p2:5

c语言错误c4430,C 语言 typedef 与 #define 比较相关推荐

  1. c语言错误c1021,c语言经典错误

    C语言命语法错误大全 C语言命语法错误大全 fatalerrorC1004: unexpectedendoffilefound 未找到文件末尾(可能是括号匹配问题) fatalerrorC1021: ...

  2. c语言错误c4430,声明*C某类::Getdocument();(已声明,不兼容)

    创建了一个CRightWindow类,基类为CScrollView,在.h文件中如下: public: CMy2015Doc* GetDocument();           // error C2 ...

  3. c语言错误writing,C语言编译器的错误信息

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Not a valid expression format type 不合法的表达式格式 Not an allowed type 不允许使用的类型 Num ...

  4. c语言错误封装,C语言实现的封装,继承,多态

    提到面向对象编程,我们想到的就是封装.继承.多态,但是其实这几个特性并不是只有面向对象语言才能实现,面向过程的C语言也是可以支持实现这三个特性的,下面我们来具体看下 封装1 2 3 4// point ...

  5. c语言错误stray,C语言20条编程中遇到的错误提示(4页)-原创力文档

    C语言20条编程中遇到的错误提示 代码: 编译器提示错误:error: 'else' without a previous 'if' 错误原因解读:'else'的前面没有匹配的'if' 代码: 编译器 ...

  6. c语言错误2015,C语言2015(回答).doc

    C语言2015(回答) 一.单项选择题 1.以下不是C语言特点的是( B ). A)C语言简洁.紧凑 B) 能够编制出功能复杂的程序 C)C语言可以直接对硬件进行操作 D) C语言移植性好 2.以下不 ...

  7. c语言错误re,c语言malloc之后再realloc的有关问题

    C/C++ code#include #include #include "../Status.h" #define STACK_INIT_SIZE 5 //堆栈初始大小 #def ...

  8. c语言错误指导,c语言编程指导.pdf

    高质量C++/C 编程指南 文件状态 文件标识: [ ] 草稿文件 当前版本: 1.0 [ √] 正式文件 作 者: 林锐 博士 [ ] 更改正式文件 完成日期: 2001 年7 月24 日 高质量C ...

  9. c语言错误spawning,C语言一直出现Error spawning cl.exe的解决办法

    这几天这个问题一直困扰着我,我考二级三|级时用过的VisualC++软件拷贝到别人电脑上后,一直出现这个问题.因为在准备计算机四级,我好久没用过这个软件了.开始我有点不相信,今天我验证了一下,结果如下 ...

最新文章

  1. OpenCV运动检测跟踪(blob track)框架组成模块详解
  2. 改变你的 KDE 桌面的外观和感觉方法介绍
  3. CF1471 D - Strange Definition(思维,分类讨论,lcm,gcd的性质,数论)
  4. 去某大厂三面总监面,因为迟到了5分钟,面试官当着我的面把简历扔垃圾桶了...
  5. JavaScript中的this妙用
  6. PowerDesigner连接数据库,PowerDesigner将数据同步到数据库,PowerDesigner和数据库中的表进行比对
  7. python的raw函数_Python内建函数之raw_input()与input()代码解析
  8. redis 清空缓存_「镜头回放」简直了!spring中清除redis缓存导致应用挂死
  9. Redis学习---(14)Redis 事务
  10. Jsp Servlet Mysql实现的Java Web在线商城项目源码
  11. 【java笔记】StringBuilder类
  12. Nginx源码分析 - Event事件篇 - Nginx的Event事件模块概览(17)
  13. 奇奇怪怪的东西(1)
  14. 用Java发起HTTP请求与获取状态码(含状态码列表)
  15. 利用Windows自带的Certutil查看文件MD5
  16. 多媒体计算机辅助英语教学,多媒体计算机辅助英语教学初探
  17. 树梅派学习 15. 语音合成软件使用
  18. 实验8 OpenGL太阳系动画
  19. 你可能不知道,Diffusion现在有多火
  20. 表白神器——Python画丘比特之箭穿心

热门文章

  1. android a z 快速定位,快速集成android实现listview的字母A-Z排序,界面侧边字母索引...
  2. kdj python实现_一颗韭菜的自我修养:用Python分析下股市,练练手
  3. 金鑫是著名高校计算机,金鑫 个人简历
  4. oracle数据库详细性能参数,ORACLE数据库性能参数的优化
  5. c#获取父类_C#——父类中的this的指向,及用反射获取当前类所在的Type | 学步园...
  6. python 上传文件夹,python – 使用Flask上传文件夹/文件
  7. 计算机应用技术适合女孩学吗,2021计算机应用技术女生学难吗
  8. mysql if语句 oracle,Oracleifelse语句的写法实例
  9. php数组操作之合并相同键名的值,排序,排重,去空值等
  10. 关于js选项卡的一些问题