aboutsummaryrefslogtreecommitdiffstats
path: root/docs/source/arduino/static.rst
blob: b292891152d205197ca6c5eaa881bdffa0f1ed93 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
.. highlight:: cpp

.. _arduino-static:

Static
======

The ``static`` keyword can be used to create variables that are
visible to only one function. However, unlike local variables that get
created and destroyed every time a function is called, ``static``
variables persist beyond the function call, preserving their data
between function calls.

Variables declared as ``static`` will only be created and initialized
the first time a function is called.

.. note:: This is only one use of the ``static`` keyword in C++.  It
   has some other important uses that are outside the scope of this
   documentation; consult a reliable C++ reference for details.

Example
-------

One use case for ``static`` variables is implementing counters that
last longer than the functions which need them, but shouldn't be
shared to other functions.  Here's an example::

    void setup() {
        SerialUSB.begin();
    }

    void loop() {
        int reading;
        if (timeToReadSensors()) {
            reading = readSensors();
        }
        // do something with reading
    }

    int readSensors() {
        static int numSensorReadings = 0;
        numSensorReadings++;
        if (numSensorReadings % 100 == 0) {
            SerialUSB.print("just got to another 100 sensor readings");
        }
        return analogRead(...);
    }

In this example, the static variable ``numSensorReadings`` is
initialized to zero the first time ``readSensors()`` is called, and
then incremented, so it starts out at one.  Subsequent calls to
``readSensors()`` won't reset ``numSensorReadings`` to zero, because
it was declared ``static``.  Thus, ``numSensorReadings`` is a count of
the number of times that ``readSensors()`` has been called.