预处理命令由符号“#”开头,包括宏定义,文件包含,条件处理三个部分。
其中条件编译我还没有用过,所以就详细介绍一下宏定义和文件包含。
一.宏定义
宏定义命令为#define,它的作用就是实现用一个简单易读的字符串来代替
另一个字符串。增加程序的可读性,和维护性。
宏定义分为不带参数的宏定义,和带参数的宏定义。
不带参的宏定义:
一般格式:#define 标识符 常量表达式
例如用一个字符代替一个常数
#define PI 3.1415926
当程序中出现3.1415926这个常数的时候就可以用PI这个字符代替,如果想修改这个常数只需要修改这个宏定义中的常数,就可以达到修改整个文件中这个常数的目的。这就是增加维护性的体现。
使用注意:
使用中#define 和标识符之间必须留有空格,标识符和常量表达式之间也必须有空格。
带参数的宏定义:
带参数的宏定义和不带参数的宏定义之间的区别在于,带参数的宏定义不只是进行字符串的替换,而且还要进行参数的替换。注意是参数替换。
格式:
#define 宏符号名(参数表) 表达式
如:
#define MIN(x,y) (((x)<(y))?(x):(y))
1;注意为了安全起见后边表达式中的参数使用“()”括起来,防止程序中
使用该宏时由于优先级问题引起的错误。
如:#define S(r) PI*r*r
如果程序中用到m=S(a+b)
则替换后等同于 m="PI"*a+b*a+b
显然与我们的目的不同。
2.宏定义命令#define 要求一行内写完,如果一行内完不成可以用“”表示下一行继续。
二.文件包含
头文件的目的就是在库函数与使用该库函数的程序之间建立接口。
头文件的定义格式。
以头文件led.h为例。
#ifndef __LED_H__
#define __LED_H__
………内容………
#endif
使用尖括号和双引号的区别:
使用尖括号的话,编译时会先在系统include目录里搜索,如果找不到才会在源代码所在目录搜索;使用双引号则相反,会先在源代码目录里搜索。这就意味着,当系统里(如/usr/include/里)有一个叫做at89c51.h的头文件,而你的源代码目录里也有一个你自己写的at89c51.h头文件,那么使用尖括号时用的就是系统里的;而使用双引号的话则会使用你自己写的那个。
所以建议: 使用系统里提供的头文件时使用尖括号
使用自己编写的头文件时使用双引号
典型的头文件内容包括:
1:说明文字。用于注释该头文件的主要内容,函数的作用,函数的接口等
2; #define 命令命名的宏定义
3:类型定义。包括结构体,共用体,数组等类型定义
关键字:51单片机 C语言 预处理
引用地址:
基于51单片机-C语言之预处理总结
推荐阅读最新更新时间:2024-10-21 13:32
基于51单片机--C语言之预处理总结
编译预处理器是C语言编译器的一个重要组成部分。很好的利用C语言的预处理命令可以增强代码的可读性,灵活性,和易于修改等特点,便于程序的结构化。 预处理命令由符号“#”开头,包括宏定义,文件包含,条件处理三个部分。 其中条件编译我还没有用过,所以就详细介绍一下宏定义和文件包含。 一.宏定义 宏定义命令为#define,它的作用就是实现用一个简单易读的字符串来代替 另一个字符串。增加程序的可读性,和维护性。 宏定义分为不带参数的宏定义,和带参数的宏定义。 不带参的宏定义: 一般格式:#define 标识符 常量表达式 例如用一个字符代替一个常数 #define PI 3.1415926 当程序中出现3.1415926这个常数的时候就
[单片机]
基于51单片机-C语言之预处理总结
简介:编译预处理器是C语言编译器的一个重要组成部分。很好的利用C语言的预处理命令可以增强代码的可读性,灵活性,和易于修改等特点,便于程序的结构化。 预处理命令由符号“#”开头,包括宏定义,文件包含,条件处理三个部分。 其中条件编译我还没有用过,所以就详细介绍一下宏定义和文件包含。 一.宏定义 宏定义命令为#define,它的作用就是实现用一个简单易读的字符串来代替 另一个字符串。增加程序的可读性,和维护性。 宏定义分为不带参数的宏定义,和带参数的宏定义。 不带参的宏定义: 一般格式:#define 标识符 常量表达式 例如用一个字符代替一个常数 #define PI 3.1415926
[单片机]
基于51单片机-C语言之预处理总结
预处理命令由符号“#”开头,包括宏定义,文件包含,条件处理三个部分。 其中条件编译我还没有用过,所以就详细介绍一下宏定义和文件包含。 一.宏定义 宏定义命令为#define,它的作用就是实现用一个简单易读的字符串来代替 另一个字符串。增加程序的可读性,和维护性。 宏定义分为不带参数的宏定义,和带参数的宏定义。 不带参的宏定义: 一般格式:#define 标识符 常量表达式 例如用一个字符代替一个常数 #define PI 3.1415926 当程序中出现3.1415926这个常数的时候就可以用PI这个字符代替,如果想修改这个常数只需要修改这个宏定义中的常数,就可以达到修改整个文件中这个常数的
[单片机]
51单片机总结--C语言之预处理
编译预处理器是C语言编译器的一个重要组成部分。很好的利用C语言的预处理命令可以增强代码的可读性,灵活性,和易于修改等特点,便于程序的结构化。 预处理命令由符号 # 开头,包括宏定义,文件包含,条件处理三个部分。 其中条件编译我还没有用过,所以就详细介绍一下宏定义和文件包含。 一.宏定义 宏定义命令为#define,它的作用就是实现用一个简单易读的字符串来代替 另一个字符串。增加程序的可读性,和维护性。 宏定义分为不带参数的宏定义,和带参数的宏定义。 不带参的宏定义: 一般格式:#define 标识符 常量表达式 例如用一个字符代替一个常数 #define PI 3.1415926 当程序中
[单片机]
89 C语言预处理指令总结
预处理指令是以#号开头的代码行,#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符,整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。 下面是本章涉及到的部分预处理指令: 指令 说明 # 空指令,无任何效果 #include 包含一个源代码文件 #define 定义宏 #undef 取消已定义的宏 #if 如果给定条件为真,则编译下面代码 #ifdef 如果宏已经定义,则编译下面代码 #ifndef 如果宏没有定义,则编译下面代码 #elif 如果前面的#if给定条件不为真,当前条件为真,则编译下面代码 #endif 结束一
[单片机]
学习笔记--C语言的预处理--条件编译
预处理名称意义 #define 宏定义 #undef 撤销已定义过的宏名 #include 使编译程序将另一源文件嵌入到带有#include 的源文件中 #if #else #elif #endif等条件编译 #line 改变当前行数和文件名称,它们是在编译程序中预先定义的标识符 命令的基本形式如下:#line number #error 编译程序时,只要遇到#error 就会生成一个编译错误提示消息,并停止编译 #pragma 为实现时定义的命令,它允许向编译程序传送各种指令例如,编译程序可能有一种选择,它支持对程序执行的跟踪。可用#pragma 语句指定一个跟踪选择。 条件编译 条件编译的功能使得我们
[单片机]
有关c语言预处理
先看下面三个问题: 1.预处理是C语言的一部分吗? 2.包含 # 的都是预处理吗? 3.预处理后面都不需要加;吗? 下面是ANSI标准定义的C语言预处理指令: 另外,ANSC还定义了如下宏: _LINE_ 表示正在编译的文件的行号 _FILE_ 表示正在编译的文件的名字 _DATE_ 表示编译时刻的日期字符串,例如: 25 Dec 2007 _TIME_ 表示编译时刻的时间字符串,例如: 12:30:55 _STDC_ 判断该文件是不是定义成标准C 如果你用的是标准编译器,理论上支持上宏定义,当然,如果不是标准的话,有可能支持一部分,或者完全不支持。注意:宏名的书写由标识符与两边各二条下划线构成。 现在回到刚开始的问题:
[单片机]
杂谈PID控制算法——最终篇:C语言实现51单片机中的PID算法
真遗憾,第二篇章没能够发表到首页上去。趁热打铁。把最终篇——代码篇给发上来。 代码的设计思想请移步前两篇文章 //pid.h #ifndef __PID__ #define __PID__ /*PID = Uk + KP* +KI*E(k)+KD* ;(增量型PID算式) 函数入口: RK(设定值),CK(实际值),KP,KI,KD 函数出口: U(K)*/ typedef struct PIDValue { int8 KP; int8 KI; int8 KD; int8 F; int8 BITMOV; int EK ; int UK; int
[单片机]