当前位置:网站首页 > 技术博客 > 正文

c语言中数据类型有哪几大类?



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 ", 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

  • 上一篇: jframe的布局
  • 下一篇: 霍夫变换基本原理
  • 版权声明


    相关文章:

  • jframe的布局2026-03-20 23:29:59
  • linux tracepath命令2026-03-20 23:29:59
  • wait3函数2026-03-20 23:29:59
  • linux fdisk分区步骤2026-03-20 23:29:59
  • args=parser.parse_args()2026-03-20 23:29:59
  • 霍夫变换基本原理2026-03-20 23:29:59
  • 暗月星魂2026-03-20 23:29:59
  • cmi码波形图画法2026-03-20 23:29:59
  • kitti slam2026-03-20 23:29:59
  • 字典树模板2026-03-20 23:29:59