define

说明

#define宏定义

define是C语言中的预处理命令,它用于宏定义,可以提高源代码的可读性并且为编程提供方便。要解释define的用途,首先要了解预处理命令的概念。

所谓预处理是指在进行编译之前所作的工作。预处理是C语言的一个重要功能,它由预处理程序负责完成。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,预处理完毕后自动进入对源程序的编译。

预处理命令以“#”号开头,如#include(包含命令),#define(宏定义命令)等。预处理命令一般放在源文件的开头部分,也称为预处理部分。

在C或C++语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。

在C或C++语言中,“宏”分为有参数和无参数两种。

无参数宏定义举例

示例:
[c highlight=”1, 4, 8, 10″]
#define ledPin 13

void setup() {
pinMode(ledPin, OUTPUT);
}

void loop() {
digitalWrite(ledPin, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(ledPin, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
[/c]

在以上示例程序中:
第1行语句#define ledPin 13将宏ledPin定义为13

第4行语句pinMode(ledPin, OUTPUT);进行宏调用操作,用13去代替ledPin。经预处理宏展开后的语句为: pinMode(13, OUTPUT);

第8行语句digitalWrite(ledPin, HIGH);进行宏调用操作,用13去代替ledPin。经预处理宏展开后的语句为: digitalWrite(13, HIGH);

第10行语句digitalWrite(ledPin, LOW);进行宏调用操作,用13去代替ledPin。经预处理宏展开后的语句为: digitalWrite(13, LOW);

提示
#define语句的后面没有分号。如果你加了一个分号”;”编译器将会报错。如以下程序:
#define ledPin 3; //本语句使用分号是错误的

另外在使用define时使用等号也会产生错误。如以下程序:
#define ledPin = 3 //本语句使用等号是错误的

带参数宏定义

C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。

带参数宏定义举例

[c highlight=”1, 5″]
#define M(y) y*y+3*y
int k;

void setup() {
k=M(5);
Serial.begin(9600);
}

void loop() {
Serial.println(k);

}
[/c]

在以上示例程序中,
第1行语句#define M(y) y*y+3*y将宏M(y)定义为y*y+3*y

第5行语句宏调用时,用实参5去代替形参y,经预处理宏展开后的语句为: k=5*5+3*5