c语言错误c4430,C 语言 typedef 与 #define 比较
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 比较相关推荐
- c语言错误c1021,c语言经典错误
C语言命语法错误大全 C语言命语法错误大全 fatalerrorC1004: unexpectedendoffilefound 未找到文件末尾(可能是括号匹配问题) fatalerrorC1021: ...
- c语言错误c4430,声明*C某类::Getdocument();(已声明,不兼容)
创建了一个CRightWindow类,基类为CScrollView,在.h文件中如下: public: CMy2015Doc* GetDocument(); // error C2 ...
- c语言错误writing,C语言编译器的错误信息
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Not a valid expression format type 不合法的表达式格式 Not an allowed type 不允许使用的类型 Num ...
- c语言错误封装,C语言实现的封装,继承,多态
提到面向对象编程,我们想到的就是封装.继承.多态,但是其实这几个特性并不是只有面向对象语言才能实现,面向过程的C语言也是可以支持实现这三个特性的,下面我们来具体看下 封装1 2 3 4// point ...
- c语言错误stray,C语言20条编程中遇到的错误提示(4页)-原创力文档
C语言20条编程中遇到的错误提示 代码: 编译器提示错误:error: 'else' without a previous 'if' 错误原因解读:'else'的前面没有匹配的'if' 代码: 编译器 ...
- c语言错误2015,C语言2015(回答).doc
C语言2015(回答) 一.单项选择题 1.以下不是C语言特点的是( B ). A)C语言简洁.紧凑 B) 能够编制出功能复杂的程序 C)C语言可以直接对硬件进行操作 D) C语言移植性好 2.以下不 ...
- c语言错误re,c语言malloc之后再realloc的有关问题
C/C++ code#include #include #include "../Status.h" #define STACK_INIT_SIZE 5 //堆栈初始大小 #def ...
- c语言错误指导,c语言编程指导.pdf
高质量C++/C 编程指南 文件状态 文件标识: [ ] 草稿文件 当前版本: 1.0 [ √] 正式文件 作 者: 林锐 博士 [ ] 更改正式文件 完成日期: 2001 年7 月24 日 高质量C ...
- c语言错误spawning,C语言一直出现Error spawning cl.exe的解决办法
这几天这个问题一直困扰着我,我考二级三|级时用过的VisualC++软件拷贝到别人电脑上后,一直出现这个问题.因为在准备计算机四级,我好久没用过这个软件了.开始我有点不相信,今天我验证了一下,结果如下 ...
最新文章
- OpenCV运动检测跟踪(blob track)框架组成模块详解
- 改变你的 KDE 桌面的外观和感觉方法介绍
- CF1471 D - Strange Definition(思维,分类讨论,lcm,gcd的性质,数论)
- 去某大厂三面总监面,因为迟到了5分钟,面试官当着我的面把简历扔垃圾桶了...
- JavaScript中的this妙用
- PowerDesigner连接数据库,PowerDesigner将数据同步到数据库,PowerDesigner和数据库中的表进行比对
- python的raw函数_Python内建函数之raw_input()与input()代码解析
- redis 清空缓存_「镜头回放」简直了!spring中清除redis缓存导致应用挂死
- Redis学习---(14)Redis 事务
- Jsp Servlet Mysql实现的Java Web在线商城项目源码
- 【java笔记】StringBuilder类
- Nginx源码分析 - Event事件篇 - Nginx的Event事件模块概览(17)
- 奇奇怪怪的东西(1)
- 用Java发起HTTP请求与获取状态码(含状态码列表)
- 利用Windows自带的Certutil查看文件MD5
- 多媒体计算机辅助英语教学,多媒体计算机辅助英语教学初探
- 树梅派学习 15. 语音合成软件使用
- 实验8 OpenGL太阳系动画
- 你可能不知道,Diffusion现在有多火
- 表白神器——Python画丘比特之箭穿心
热门文章
- android a z 快速定位,快速集成android实现listview的字母A-Z排序,界面侧边字母索引...
- kdj python实现_一颗韭菜的自我修养:用Python分析下股市,练练手
- 金鑫是著名高校计算机,金鑫 个人简历
- oracle数据库详细性能参数,ORACLE数据库性能参数的优化
- c#获取父类_C#——父类中的this的指向,及用反射获取当前类所在的Type | 学步园...
- python 上传文件夹,python – 使用Flask上传文件夹/文件
- 计算机应用技术适合女孩学吗,2021计算机应用技术女生学难吗
- mysql if语句 oracle,Oracleifelse语句的写法实例
- php数组操作之合并相同键名的值,排序,排重,去空值等
- 关于js选项卡的一些问题