typedef和define的区别,const的使用

 (1)#define是预处理指令,

在编译预处理时进行简单的替换,不作正确性检查,不管含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错;

而typedef是在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名。

 
   (2)typedef int * ptr与#define ptr int *的区别:

作用都是用ptr代表int * ,但是二者不同,正如前面所说 ,#define在预处理时进行简单的替换,而typedef不是简单替换 ,而是采用如同定义变量的方法那样来声明一种类型。

#define ptr int * ;ptr a, b; 相当于int * a, b只是简单的宏替换。

typedef int* ptr;ptr a, b; a, b 都为指向int的指针,typedef为int* 引入了一个新的助记符,但是这个时候,如果使用stuct Node* a,b;时编译器会报错(意图是定义两个结构体指针变量),正确的定义方式为stuct Node* a,*b;。 


   (3)typedef int * pint与#define PINT int * 
       const pint p;//p不可以指向其他地方,但p指向的内容可更改。这种情况与“int * const p”语句类似。 
       const PINT p;//p可指向其他地方,但是p指向的内容只读。 这种情况与“int  const *p”语句类似。 
       pint是一种指针类型,const pint p 就是把指针给锁住了,p不可更改而const PINT p 是const int * p, 锁的是指针p所指的对象。 
       另外,const关键字作用的指针还是指针指向的内容,可以用*作为分界线,如果const在*号左面,那么指向内容为只读,如果const在*右面,那么指针为只读不能指向其他地方。  

(4)#define不是语句,不要在行末加分号,否则会连分号一块置换。 

(5)关于typedef和define的作用域 
       1) 不管是typedef还是define,都不能在定义之前使用; 
       2) typedef受函数范围影响,而define不受; 
       3) 不管是typedef还是define,其作用域都不会扩展到别的文件,即使是同一个程序的不同文件,也不能互相使用。

 
(6)typedef和结构体

注意:在C++中struct 的成员默认是公有的,而类的成员默认是私有的。struct 和 class 在其他方面是功能相当的。 
        
       struct  
       {  
             int num ;   
       }stu1;   //只能在定义结构体时用一次,以后再也无法定义此结构体变量,缺乏灵活性。 
        
       struct student  
       {  
             int num ;   
       }stu1;   //此处定义结构体时,顺便定义了结构体变量。 
        
       typedef struct student  
       {  
            int num ;   
       }stu1;   //注意:此处并非结构体变量,而是结构体类型(相当于人的小名,相当于struct student) 
   
       typedef struct Node 
       { 
            int data; 
            pNode pNext; 
       }*pNode;            //编译出错 


       问题分析:C语言允许在结构中包含指向它自己的指针,可以在建立链表等数据结构的实现上看到无数这样的例子,上述代码的根本问题在于typedef的应用。新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识pNode。     
        
       解决方案: 
       typedef struct Node 
       { 
            int data; 
            struct Node *pNext; 
       }*pNode; 

 

(7)如果是在main.c中,及main函数之前定义的变量,为贯穿整个应用程序的全局变量,不管这个程序有多少个线程,或是多少个其他.c文件,在那些文件中都可以直接使用。

如果是在非main.c中定义的变量,比如在test1.c文件中头文件后定义了一个变量"int A;",那么在test2.c文件中要使用这个变量A,必须在test2.c文件头文件后使用关键字对这个变量做声明,即"extern int A;"语句后, test2.c文件中的函数才可以访问这个变量。

用extern关键字时,如果是声明变量,那么用extern时不能对变量赋值;如果是声明数组,那么用extern时可以不对数组大小做声明,比如extern a[]; 如果是声明函数,必须指明函数参数和类型。

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值