变量作用域 & 修饰符
variable scope
Arduino使用的C编程语言的变量,有一个名为作用域(scope) 的属性。这一点与类似BASIC的语言形成了对比,在BASIC语言中所有变量都是全局(global) 变量。
在一个程序内的全局变量是可以被所有函数所调用的。局部变量只在声明它们的函数内可见。在Arduino的环境中,任何在函数(例如,setup(),loop()等)外声明的变量,都是全局变量。
当程序变得更大更复杂时,局部变量是一个有效确定每个函数只能访问其自己变量的途径。这可以防止,当一个函数无意中修改另一个函数使用的变量的程序错误。
有时在一个for循环内声明并初始化一个变量也是很方便的选择。这将创建一个只能从for循环的括号内访问的变量。
示例:
int gPWMval; // 任何函数都可以调用这个变量 void setup() { // ... } void loop() { int i; // "i"只在"loop"函数内可用 float f; // "f"只在"loop"函数内可用 // ... for (int j = 0; j <100; j++){ //变量 “J”只能在for循环括号内访问 } }
static
'static'关键字用于创建只对某一函数可见的变量。然而,和局部变量不同的是,局部变量在每次调用函数时都会被创建和销毁,静态变量在函数调用后仍然保持着原来的数据。
静态变量只会在函数第一次调用的时候被创建和初始化。
示例:
/* RandomWalk * Paul Badger 2007 * RandomWalk函数在两个终点间随机的上下移动 * 在一个循环中最大的移动由参数“stepsize”决定 *一个静态变量向上和向下移动一个随机量 *这种技术也被叫做“粉红噪声”或“醉步” */ #define randomWalkLowRange -20 #define randomWalkHighRange 20 int stepsize; int thisTime; int total; void setup() { Serial.begin(9600); } void loop() { // 测试randomWalk函数 stepsize = 5; thisTime = randomWalk(stepsize); Serial.println(thisTime); delay(10); } int randomWalk(int moveSize){ static int place; // 在randomwalk中存储变量 //声明为静态因此它在函数调用之间能保持数据,但其他函数无法改变它的值 place = place + (random(-moveSize, moveSize + 1)); if (place < randomWalkLowRange){ //检查下限和上限 place = place + (randomWalkLowRange - place); // 将数字变为正方向 } else if(place > randomWalkHighRange){ place = place - (place - randomWalkHighRange); // 将数字变为负数 } return place; }
volatile
'volatile'是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。如果没有'volatile',基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。
示例:
// 当中断引脚改变状态时,开闭LED int pin = 13; volatile int state = LOW; void setup() { pinMode(pin, OUTPUT); attachInterrupt(0, blink, CHANGE); } void loop() { digitalWrite(pin, state); } void blink() { state = !state; }
const
'const'关键字代表常量。它限定一个变量不允许被改变。这意味着该变量,就像任何相同类型的其他变量一样使用,但不能改变其值。如果尝试为一个const变量赋值,编译时将会报错。const关键字定义的常量,遵守 variable scoping 管辖的其他变量的规则。这一点加上使用 #define的缺陷 ,使 const 关键字成为定义常量的一个的首选方法。
示例:
const float pi = 3.14; float x; // .... x = pi * 2; //在数学表达式中使用常量不会报错 pi = 7; //错误的用法 - 你不能修改常量值,或给常量赋值
#define 或const
您可以使用 const 或 #define 创建数字或字符串常量。但对于arrays, 你只能使用 const。 一般 const 是首选#define定义常量。