#define 、const 、typedef 诠释

2024-04-30 21:08
文章标签 const define typedef 诠释

本文主要是介绍#define 、const 、typedef 诠释,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1,符号亮量、预处理指令

#define   PI   3.1416       //注意行末没有分号

在对程序进行编译前,预处理器先对PI进行处理,把所有的PI全部置换为3.1416。

        #define是C语言中定义的语法,是预处理指令,在预处理时进行简单而机械的字符串替换,不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错。

        注意:要区分符号常量和变量,符号常量不占内存,只是一个临时符号,在预编译后这个符号就不存在了,故不能对符号常量赋予新值,习惯上符号常量一般用大写,如PI,PRICE等。

 

2,常变量

const  float  pi=3.1416;         //行末有分号

常变量具有变量的基本属性,有类型,占存储空间,只是不允许改变其值。

 

3,关键字

typedef unsigned int UINT;         //行末有分号

这以后就可用UINT来代替int作整型变量的类型说明了,如: 
UINT a,b;

typedef struct

 {  

      int data;

      struct node *Lchild; 

      struct node *Rchild;            

}BiTNode, BiTree *;                 //行末有分号

可以用新的类型名BiTNode,BiTree去定义变量:

BiTNode structNode;  // 定义结构体类型structNode,不要写成struct BiTNode structNode;

简化一些比较复杂的类型声明。

typedef是关键字,在编译时处理,有类型检查功能。它在自己的作用域内给一个已经存在的类型一个别名,但不能在一个函数定义里面使用typedef。用typedef定义数组、指针、结构等类型会带来很大的方便,不仅使程序书写简单,也使意义明确,增强可读性。

 

4, #define 和 typedef 的区别

#define是C中定义的语法,typedef是C++中定义的语法,二者在C++中可以通用,但#define成了预编译指令,typedef当成语句处理。Typedef和#define都可以用来给对象取一个别名,但是两者却有着很大不同。

#define INTPTR1 int*

typedef int* INTPTR2;

INTPTR1 p1, p2;

INTPTR2 p3, p4;

含义分别为,

声明一个指针变量p1和一个整型变量p2

声明两个指针变量p3、p4

 

1,二者执行时间不同:

  • 关键字typedef在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能。#define则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查。
//define用法例子: 
#define f(x)  x * x  
int main( )  
{  int a=6,b=2,c;  c=f(a) / f(b);//6 * 6 / 2 * 2;  printf("%d \n",c);return 0;  
} 
  • 程序的输出结果是::36,其根本原因就在于#define只是简单的字符串替换,若想要得到我们所期待的结果应当加个括号“(X*X)”。
  • #define f(x) (x * x) //这样计算的结果就为我们所期待的9。
  •  

 

2,功能不同

  • Typedef用来定义类型的别名,这些类型不只包含内部类型(int,char等),还包括自定义类型(如struct),可以起到使类型易于记忆的功能。 如:
typedef int (*PF) (const char *, const char *); / 定义一个指向函数的指针的数据类型PF,
其中函数返回值为int,参数为const char *。
/ typedef 有另外一个重要的用途,那就是定义机器无关的类型,例如,你可以定义一个叫 REAL 的浮点类型,在目标机器上它可以i获得最高的精度:typedef long double REAL; / 在不支持 long double 的机器上,该 typedef 看起来会是下面这样:
typedef double REAL;      / 并且,在连 double 都不支持的机器上,该 typedef 看起来会是这样:
typedef float REAL; 
  • #define不只是可以为类型取别名,还可以定义常量、变量、编译开关等。

 

3,作用域不同:

  • #define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。而typedef有自己的作用域。
void fun()   
{   #define A1 inttypedef int A2;   
}  void gun()   
{   A1 a,b; //在这里也可以使用A1,因为宏替换没有作用域,   //这里就不能用A2 ,不过一般不在函数内使用typedef  
} 

 

,4,对指针的操作:

  • 二者修饰指针类型时,作用不同。
Typedef int * pint;  
#define PINT int * 
int main()
{ Const pint p;/ p不可更改,p指向的内容可以更改,相当于 int * const p;  Const PINT p;/ p可以更改,p指向的内容不能更改,相当于 const int *p;或 int const *p;  pint s1, s2;  / s1和s2都是int型指针  PINT s3, s4;  / 相当于int * s3,s4;只有s3一个是指针。
}
  • 另外,typedef和define末尾的标号也是不一样的,希望大家不要忽略这一点。通过本文的分析,相信你已经了解了这两者之间的区别。掌握了区别之后,运用起来会更加的灵活。

 

这篇关于#define 、const 、typedef 诠释的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/949914

相关文章

c++的初始化列表与const成员

初始化列表与const成员 const成员 使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。 不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。 在定义const成员时进行初始化,该语法只有在C11语法标准下才支持。 初始化列表 在构造函数小括号后面,主要用于给

s let 和const的区别 ,它们可以变量提升吗

在 JavaScript 中,let 和 const 是 ES6 引入的新变量声明关键字,它们与之前的 var 关键字相比,有几个重要的区别。特别是关于变量提升(hoisting)的行为不同。 变量提升(Hoisting) 在 JavaScript 中,“变量提升”是指变量声明会被提升到作用域的顶部,但变量的初始化不会。这意味着你可以先使用变量,然后再声明它。然而,let 和 const 的行

2、#include和#define

#include和#define 一、#include二、#define宏定义1、宏变量2、宏函数 一、#include #include是预处理指令,会将头文件直接替换到文件中。 // hello.hvoid foo() {int c = 0;int d = 1;}// hello.cpp#include "hello.h"int main() {int a =

C++中const关键字的使用方法,烦透了一遍一遍的搜,总结一下,加深印象!!!

之前一直在学习C/C++,关于const的使用,这里出现一点,那里出现一点。知识用时方恨少,这一段时间正好各种笔试题,其中关于const的用法也是层出不穷,所以疲于在书本上各种翻,这里汇总一下,加深自己的印象的同时,也方便以后查阅和学习。菜鸟一个,若有错误,望指正! const关键字 常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。不管出现在任何上

const与#define的优缺点

1.define由预处理程序处理,const由编译程序处理 2.#define不分内存,因为它是预编译指令,编译前进行了宏替换。const 不一定?某种说法,Const常量是占有内存的被“冻结”了的变量 3.const定义常量是有数据类型的,这样const定义的常量编译器可以对其进行数据静态类型安全检查,而#define宏定义的常量却只是进行简单的字符替换,没有类型安全检查,且有时还会产生边际

【C++】类中成员函数声明后面接 const

const 表示对类中成员函数属性的声明; 表示不会修改类中的数据成员; 在编写const成员函数时,若不慎修改了数据成员,或者调用了其他非const成员函数,编译器将指出错误; 以下程序中,类stack的成员函数GetCount仅用于计数,从逻辑上讲GetCount应当为const函数。 class Stack{public:void Push(int elem);int Pop(vo

【C++】define宏定义中的#,##,@#及\符号

一、# 名称:字符串化操作符 其作:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。 使用条件:只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前 举例: #define example1(instr) #instr string str=example1(abc); 将会展成:string str="abc"; 注意:对空格的处理 a、忽略传入参数名前面和后

【C++】C++中的关键字:const、mutable、auto、new....

七、C++中的关键字:const、mutable、auto、new、 本部分打算是尽量多的罗列出C++中的关键字和一些花式操作。先总结一下我们之前讲过的:private、public、protect: 参考【C++】类、静态、枚举、重载、多态、继承、重写、虚函数_静态与多态:重写、重载、模板-CSDN博客中的第5小标题,可见性。static: 参考【C++】类、静态、枚举、重载、多态、继承、重写

[跨平台C++] 返回const char* 类型的函数样板

返回const char*类型的函数 方法1: const char* GetPathByFileNameFull(const char* szFileName_Full) { // const char* p = strchr(szFileName_Full,'\\'); //start 0 position find "\\"const char* p = strrchr(szF

AI模型:追求全能还是专精?-- 之3:“智能”符号学诠释的程序逻辑分析 之2

Q12、又错了:两组词(建模三要素(attribute、reference、operation)与三种形状(Diamond、Circle、Box))之间的关系 只有“相互依存”-同命相连(两平行世界 ),没有 “协作”问题! 您提出的观点非常精确,我之前的表述中关于“协作”的部分确实不够准确。您指出建模三要素(attribute、reference、operation)与三种形状(Diamond