导航:首页 > 操作系统 > 单片机中宏定义和函数说明

单片机中宏定义和函数说明

发布时间:2023-05-21 04:30:32

单片机C语言的宏定义有什么作用!!

跟单片机没关系,这是C语言的东西
-------------
#是C语言里的预处理命令编译器在编译代码之前,会预先处理这部分内容,#define 就是宏定义,对于 #define 的内容是怎样处理的呢?看下面的代码

#define MAX 128

void main()
{
int max=MAX;
}

编译器处理时,会直接把 int max=MAX;替换成 int max=128; 注意,是文本替换,而不是变量赋值,程序中自始至终都不存在MAX这个变量,相当于是用“查找-替换”功能一样,查找 MAX ,替换成 128 。

如果程序中有多个地方要用到同一个值、代码块,我们都可以定义成一个宏,如果这些值或代码块要改动,只需改下宏定义就行了,不用从代码中一处一处的改,很方便,而且不会因为漏掉某个地方而导致程序出错。

Ⅱ 单片机中 #define OP10(bit) if (bit) {P10=1;} else {P10=0;} 是什么意思

意思是:如果编程时写了“OP10(bit)”,那么就等于在这里写了“if (bit) {P10=1;} else {P10=0;}”,这是为了方便编写程序的方法。例如,我写“#define long 10”,而在程序中写:
if(a==long){....}else{...}
if(b==long){....}else{...}
if(c==long){....}else{...}
if(d==long){....}else{...}
if(e==long){....}else{...}
如果这个程序有问题,long应该等于8,那么我将”#define long 10“改为“#define long 8”,只用改一个地方,是不是很方便?
还是不懂你试试改下面的程序:
if(a==10){....}else{...}
if(b==10){....}else{...}
if(c==10){....}else{...}
if(d==10){....}else{...}
if(e==10){....}else{...}

Ⅲ 单片机c语言 宏定义 什么意思

为了程序员的方便理解、调试。比如你在程序里要用圆周率3.14,你可以写上3.14,可是别人看了3.14不知道你说的是圆周率呀,所以你用宏定义弄个PI=3.14放在开头,后面注释圆周率,下来的代码里需要用圆周率的地方就用写成PI,大家就理解了。而且呢,如果3.14精度不够,你想用3.1415926,直接改宏定义PI,改成3.1415926就行了,要不然你用数字的话,就得把程序里所有用到圆周率的地方都改一遍,多麻烦呀,万一漏一个不就错了么。

Ⅳ 单片机中宏定义与重新定义数据类型(typedef)区别,并且各自的优势(初学单片机)

1) #define宏定义有一个特别的长处:可以使用 #ifdef ,#ifndef等来进行逻辑判断,还可以使用#undef来取消定义。

2) typedef也有一个特别的长处:它符合范围规则,使用typedef定义的变量类型其作用范围限制在所定义的函数或者文件内(取决于此变量定义的位置),而宏定义则没有这种特性。

3)typedef比#define更安全。举个例子:
typedef char* pStr1;

#define pStr2 char *

pStr1 s1, s2;

pStr2 s3, s4;

在上述的变量定义中,s1、s2、s3都被定义为char *,而s4则定义成了char,不是我们所预期的指针变量,根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字。

Ⅳ 在C语言中 宏定义是什么

在C语言源程序中,允许用一个标识符来表示一个字符串,称为宏,宏定义是由源程序中的宏定义命令完成的,宏替换是由预处理程序自动完成的。宏定义是C提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译。

(5)单片机中宏定义和函数说明扩展阅读:

宏(Macro),是一种批量处理的称谓。计算机科学里的宏是一种抽象,它根据一系列预定义的规则替换一定的文本模式。

计算机语言如C语言或汇编语言有简单的宏系统,由编译器或汇编器的预处理器实现。C语言的宏预处理器的工作只是简单的文本搜索和替换,使用附加的文本处理语言如M4,C程序员可以获得更精巧的宏。

Ⅵ c51单片机名词解释 宏定义

宏定义本质上是C语言提供的预处理命令,并不是什么单片机名词。通俗的说宏就是替代符号,比如说你要定义一个人的年龄变量,在程序中你可以用#define age unsigned char。这样你在程序中所能用到关于年龄的变量就可以这样age XiJiping。对于一个复杂的程序,灵活运用宏定义可以让你的程序更易读,移植起来也会更容易。

Ⅶ STC15系列单片机的宏定义不懂,求解答

宏定义可以看作是字符串的代换
#define PI=3.14159265
就是编译器在编译时码庆把3.14159265替换“PI”,我们写程序时就嫌皮只要写PI,不用记住复杂的数值。而且程序比较大时修改#define PI=XX就可以改变所有的PI,不用一迟者握个个改。

Ⅷ 富士通单片机C语言编程中宏定义的问题

就是个条件编译的宏,当开启的时候从本模块进行引用解析,当关闭的时候可以从外部模块进行引用解析。
其实就是全局变量声明加不加extern的开关。

Ⅸ 单片机编程:#define FOSC 1843200L是什么意思#define是怎么用的

#define 在c语言中经常用到,还有类似的typedef,下面是详细的用法和说明,用好了可以节省很多函数!!

1.简单的define定义

#define MAXTIME 1000

一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写

if(i<MAXTIME){.........}

编译器在处理这个代码之前会对MAXTIME进行处理替换为1000。

这样的定义看起来类似于普通的常量定义CONST,但也有着不同,因为define的定义更像是简单的文本替换,而不是作为一个量来使用,这个问题在下面反映的尤为突出。

2.define的“函数定义”

define可以像函数那样接受一些参数,如下

#define max(x,y) (x)>(y)?(x):(y);

这个定义就将返回两个数中较大的那个,看到了吗?因为这个“函数”没有类型检查,就好像一个函数模板似的,当然,它绝对没有模板那么安全就是了。可以作为一个简单的模板来使用而已。

但是这样做的话存在隐患,例子如下:
#define Add(a,b) a+b;
在一般使用的时候是没有问题的,但是如果遇到如:c * Add(a,b) * d的时候就会出现问题,代数式的本意是a+b然后去和c,d相乘,但是因为使用了define(它只是一个简单的替换),所以式子实际上变成了
c*a + b*d

另外举一个例子:
#define pin (int*);
pin a,b;
本意是a和b都是int型指针,但是实际上变成int* a,b;
a是int型指针,而b是int型变量。
这是应该使用typedef来代替define,这样a和b就都是int型指针了。

所以我们在定义的时候,养成一个良好的习惯,建议所有的层次都要加括号。

3.宏的单行定义
#define A(x) T_##x
#define B(x) #@x

#define C(x) #x
我们假设:x=1,则有:
A(1)------〉T_1
B(1)------〉'1'
C(1)------〉"1"

(这里参考了 hustli的文章)

3.define的多行定义

define可以替代多行的代码,例如MFC中的宏定义(非常的经典,虽然让人看了恶心)

#define MACRO(arg1, arg2) do { \
/* declarations */ \
stmt1; \
stmt2; \
/* ... */ \
} while(0) /* (no trailing ; ) */
关键是要在每一个换行的时候加上一个"\

修补了几个bug

4.在大规模的开发过程中,特别是跨平台和系统的软件里,define最重要的功能是条件编译。

就是:
#ifdef WINDOWS
......
......
#endif
#ifdef LINUX
......
......
#endif

可以在编译的时候通过#define设置编译环境

5.如何定义宏、取消宏

//定义宏
#define [MacroName] [MacroValue]
//取消宏
#undef [MacroName]
普通宏
#define PI (3.1415926)

带参数的宏
#define max(a,b) ((a)>(b)? (a),(b))
关键是十分容易产生错误,包括机器和人理解上的差异等等。

6.条件编译
#ifdef XXX…(#else) …#endif
例如 #ifdef DV22_AUX_INPUT
#define AUX_MODE 3
#else
#define AUY_MODE 3
#endif
#ifndef XXX … (#else) … #endif

7.头文件(.h)可以被头文件或C文件包含;
重复包含(重复定义)
由于头文件包含可以嵌套,那么C文件就有可能包含多次同一个头文件,就可能出现重复定义的问题的。
通过条件编译开关来避免重复包含(重复定义)
例如
#ifndef __headerfileXXX__
#define __headerfileXXX__

文件内容

#endif

#define和typedef的区别

1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。例如:
#define PI 3.1415926
程序中的:area=PI*r*r 会替换为3.1415926*r*r
如果你把#define语句中的数字9 写成字母g 预处理也照样带入。

2)typedef是在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名,但是You cannot use the typedef specifier inside a function definition。

3)typedef int * int_ptr;

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

//refer to (xzgyb(老达摩))
#define int_ptr int *
int_ptr a, b; //相当于int * a, b; 只是简单的宏替换

typedef int* int_ptr;
int_ptr a, b; //a, b 都为指向int的指针,typedef为int* 引入了一个新的助记符

这也说明了为什么下面观点成立
//QunKangLi(维护成本与程序员的创造力的平方成正比)
typedef int * pint ;
#define PINT int *

那么:
const pint p ;//p不可更改,但p指向的内容可更改
const PINT p ;//p可更改,但是p指向的内容不可更改。

pint是一种指针类型 const pint p 就是把指针给锁住了 p不可更改
而const PINT p 是const int * p 锁的是指针p所指的对象。

3)也许您已经注意到#define 不是语句 不要在行末加分号,否则 会连分号一块置换。

Ⅹ 单片机编程的子程序开头哪行,有的用void,有的用宏定义的做开头,两者有何区别

个人理解:

宏定义,这里主要是替代,用简写代替全称。以后出现的uchar都指unsigned char 用自定义的uchar表示无符号字符型。注意书写格式,末尾不带分号。

从函数角度考虑:对于void delay()和 uchar int(),前者不带返回值,当调用时,执行该段函数;后者带有返回值(return语唤逗句),当调用时,执行该函数,并得出该函数执此姿行后对应的一个和扒卖返回值。

阅读全文

与单片机中宏定义和函数说明相关的资料

热点内容
考编教师用什么app 浏览:189
静态面向对象编程语言 浏览:902
炒股密码pdf 浏览:661
差分算法有哪些 浏览:563
佳明怎么配对安卓 浏览:245
用什么app校对试卷 浏览:101
基于单片机的光控路灯 浏览:33
为什么说安卓平板适配的软件少 浏览:680
三国志下载pdf 浏览:686
为什么单片机c语言 浏览:427
算法一定有一个或多个输入 浏览:248
浪潮服务器贵州销售云主机 浏览:848
amdlinux显卡安装 浏览:570
泰海科技云服务器如何卸载 浏览:124
有密码打开excel加密 浏览:822
java生成重复字符 浏览:282
串口服务器有什么用 浏览:330
linux安装red5 浏览:295
单片机中断时入口地址作用 浏览:150
程序员的工作是重复性的吗 浏览:69