当前位置: 首页 > 编程笔记 >

C/C++中的typedef和#define详解

华泳
2023-03-14
本文向大家介绍C/C++中的typedef和#define详解,包括了C/C++中的typedef和#define详解的使用技巧和注意事项,需要的朋友参考一下

C/C++中的typedef和#define

前言:

     在C/C++中,我们平时写程序可能经常会用到typedef关键字和#define宏定义命令,在某些情况下使用它们会达到相同的效果,但是它们是有实质性的区别,一个是C/C++的关键字,一个是C/C++的宏定义命令,typedef用来为一个已有的数据类型起一个别名,而#define是用来定义一个宏定义常量。下面谈谈两者在实际使用中应当注意的地方。

1.typedef关键字

   typedef是用来声明类型别名的,在实际编写代码过程使用typedef往往是为了增加代码的可读性。它可以为一串很长的类型名起一个别名,那么使用这个别名可以达到与原类型名相同的效果。

    如:

typedef int INT;
typedef char CHAR;

就为int和char分别起了一个别名,那么在程序中使用INT a;和int a;达到的效果是等同的。在使用typedef时应注意一下几点:

 1)typedef是为一个数据类型起一个新的别名,如typedef int INT;那么要告诉我的是INT表示整型,typedef int* INTPTR;则告诉我们INTPTR是一个指向整型变量的指针类型,这点与#define是决然不同的,#define只是作简单的字符串替换,不表达任何含义。如:

#define INTPTR1 int*
typedef int* INTPTR2;

INTPTR1 p1,p2;
INTPTR2 p3,p4;

INTPTR1 p1,p2;和INTPTR2 p3,p4;这两句的效果决然不同。INTPTR1 p1,p2;进行字符串替换后变成int* p1,p2;要表达的意义是声明一个指针变量p1和一个整型变量p2;而INTPTR2 p3,p4;由于INTPTR2是具有含义的,告诉我们是一个指向整型数据的指针,那么p3和p4都为指针变量,这句相当于int* p1,*p2;从这里可以看出,进行宏替换是不含任何意义的替换,仅仅为字符串替换;而用typedef为一种数据类型起的别名是带有一定含义的。

    再看下面这个例子:

#define INTPTR1 int*
typedef int* INTPTR2;

int a=1;
int b=2;
int c=3;
const INTPTR1 p1=&a;
const INTPTR2 P2=&b;
INTPTR2 const p3=&c;

上述代码中,const INTPTR1 p1表示p1是一个常量指针,即不可以通过p1去修改p1指向的内容,但是p1可以指向其他内容;而对于const INTPTR2 p2,由于INTPTR2表示是一个指针类型,因此用const去限定,表示封锁了这个指针类型,因此p2是一个指针常量,不可使p2再指向其他的内容,但可以通过p2修改其当前指向的内容,INTPTR2 const p3同样声明的是一个指针常量。

2)对于宏定义:

#define INT int
unsigned INT a;

  这种用法是可行的;

typedef int INT;
unsigned INT a;

是绝对错误的用法。

2.#define宏定义

   #define是一个宏定义命令,用来定义一个常量(包括无参常量和有参常量),它本身并不在编译过程中执行,而是在预处理阶段就已经完成了,因此不作任何正确性检查,只进行不关含义的字符串替换。在使用宏定义时,如果稍不注意就会发生错误,而且这个错误往往是你意想不到的。如:

#define ADD(a,b) a+b

int i=1;
int j=2;
int k=3;
int s=ADD(i,j)*k;

程序可能想求算的是(i+j)*k的结果,然而这段html" target="_blank">程序并没有达到这种效果,由于宏替换只是进行简单的字符串替换,那么ADD(i,j)*k相当于i+j*k,并不是想象中的(i+j)*k。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

 类似资料:
  • 我已经开始在win32上使用C。正如我们所知,C结构与类相同,但默认为公共成员等。。。现在我想要的是简单的C结构,它没有默认的构造函数、复制或移动操作或任何其他魔法。因为我想将其存储在文件中,还可以执行memcpy,用作字节数组等。。。所以我想用#ifdef u cplusplus在标题中定义它,如下所示。 但这只能防止函数名称的混乱。但如果在cpp文件中,struct仍然编译为cpp struc

  • 本文向大家介绍C# #define条件编译详解,包括了C# #define条件编译详解的使用技巧和注意事项,需要的朋友参考一下 本文导读: C#的预处理器指令从来不会转化为可执行代码的命令,但是会影响编译过程的各个方面,常用的预处理器指令有#define、#undef、#if,#elif,#else和#endif等等,下面介绍C#中使用#define进行条件编译的实例。 C#中条件编译指令用于按条

  • 本文向大家介绍C/C++中*和&的用法详解,包括了C/C++中*和&的用法详解的使用技巧和注意事项,需要的朋友参考一下 C++中&和*的用法一直是非常让人头疼的难点,课本博客上讲这些知识点一般都是分开讲其用法的,没有详细的总结,导致我在这方面的知识结构格外混乱,在网上找到了一篇英文文章简单总结了这两个符号的一些用法,都是一些比较基础的知识,我比较关心的函数指针,指针函数等都没有涉及到,今后有时间把

  • 本文向大家介绍如何区分C++中的inline和#define宏,包括了如何区分C++中的inline和#define宏的使用技巧和注意事项,需要的朋友参考一下 (1)什么是内联函数? 内联函数是指那些定义在类体内的成员函数,即该函数的函数体放在类体内。 (2)为什么要引入内联函数? 当然,引入内联函数的主要目的是:解决程序中函数调用的效率问题。 另外,前面我们讲到了宏,里面有这么一个例子: 当++

  • 本文向大家介绍C及C++中typedef的简单使用介绍,包括了C及C++中typedef的简单使用介绍的使用技巧和注意事项,需要的朋友参考一下 typedef 声明,简称 typedef,为现有类型创建一个新的名字。比如人们常常使用 typedef 来编写更美观和可读的代码。所谓美观,意指 typedef 能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性。 在编程中

  • Volatile关键字 Volatile就是防优化。Volatile一般和硬件有关,指向硬件的内容可能我们需要不要让编译器去优化,每次都要读取那里的内容。比如我们在实际操作中有一个键盘,我们查看一个按键是否被按下,就是通过读取内存里面关于按键状态的高低电平来识别。那么我们怎么来读取这一个位里面的状态(0或1)?我们能够访问到最小的内存地址就是一个字节,而一个字节里面有8个位。所以我们只能利用一个u