龙空技术网

单片机C语言-预处理命令(一)无参宏定义

老马识途单片机 1442

前言:

今天我们对“c语言宏定义表达式的括号”都比较关切,朋友们都想要了解一些“c语言宏定义表达式的括号”的相关资讯。那么小编同时在网上网罗了一些对于“c语言宏定义表达式的括号””的相关知识,希望大家能喜欢,我们快快来了解一下吧!

什么是预处理命令

在单片机程序中,经常看到以“#”开头的语句,这些语句就是预处理命令,例如文件包含命令#include,宏定义命令#define等。

预处理命令在源程序中的位置

在程序中,这些预处理命令放在函数体之外i,并且一般都放在源文件的前面,即程序开始之前,因此它们也被称为预处理部分。

什么是预处理

预处理是指在对程序进行编译的第一遍扫描(词法扫描和语法扫描)之前所做的工作。当对一个源程序进行编译时,系统将自动引用预处理程序对源代码中的预处理部分进行处理。

宏定义

在C语言程序中,使用一个标识符来表示一个字符串的方法,称之为“宏”,这个标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”都用宏定义中的字符串替换,称为“宏代换”或“宏展开”。

宏定义的种类

“宏”分为有参数和无参数两种。

无参宏定义

形式为:#define 标识符 字符串

“#”表示这是一条预处理命令,define为宏定义命令;“标识符”为所定义的宏名;“字符串”可以是常数、表达式、字符串等。

为什么要用宏定义

一般情况下,常对程序中反复使用的表达式进行宏定义

无参宏定义实例

源代码如下

仿真电路图如下

运行结果如下

说明:

1、上例程序中定义了两个宏定义,我们可以观察程序的执行结果,虽然这两个宏的表达式一样,但是这两个宏的执行结果是不一样的。

2、上面示例中,两个宏的表达式一样,但由于一个表达式被括号括起来了,另一个表达式没有被括号括起来,导致计算结果不一样,所以在定义宏的时候,一定要注意,应保证宏代换之后的正确性。

宏定义的注意事项

1、预处理命令只是对宏进行宏代换,不做检查,如果有错误,只能在编译后,程序运行中才能发现

2、宏定义不是语句,在行末不用加分号,如果加上分号,则会连分号一起进行宏代换

3、宏定义必须写在函数之外,起作用域为从宏定义命令开始到源程序结束,如果要终止其作用域,则可使用#undef命令。

例如

4、宏名如果在程序中用引号括起来,则预处理程序不对其进行宏代换。

例如

程序执行结果为

5、宏定义允许嵌套,在宏定义的字符串里,可以使用已经定义的宏名。在宏代换时由于处理程序层层代换。

例如

运行结果为

6、习惯上,宏名用大写字母表示,以便于变量名区别,但是也允许用小写字母表示

7、可用宏定义表示数据类型,以使书写方便

例如

#define uch unsigned char

在程序中可用uch来做变量说明

例如

uch 5,100;

应注意宏定义表示数据类型与typedef定义数据说明符的不同。宏定义只是简单的字符串代换,是在预处理时完成的。而typedef是在编译时处理的,它不是简单的代换,而是对类型说明敷重新命名。被命名的标识符具有类型定义的说明的功能。

标签: #c语言宏定义表达式的括号