变量作用域 & 修饰符

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定义常量。