I came accross this code for writing data into EEPROM in arduino. Why is void printTemp();, void clearEEPROM(); and void writeTemp(); functions are mentioned in global declaration? How will this help?

#include <EEPROM.h>
#define SAMPLE_TIME 2000  //The time between each EEPROM write function call in ms
int tempPin = 0;      //the ADC pin
int printPin = 2;     //the print button pin
int erasePin = 4;    //the erase button pin
int address = 0;      //EEPROM address counter
unsigned long timer;
float conv_coeff = 0.0;   //coefficient for converting from 0-1024 to 0-5 range
void printTemp();
void clearEEPROM();
void writeTemp();
void setup(){
  Serial.begin(115200);     //start the serial connection as always
  conv_coeff = 5.0/1024.0;  //find the coefficient to do the conversion
  timer = millis();         //millis() returns the time since program start in ms
void loop(){
  if(millis()-timer > SAMPLE_TIME)  //check if it's time to do a temp sensor sample
    timer = millis();
  if(!digitalRead(printPin))  //check if print button is pressed
  if(!digitalRead(erasePin)) //check if erase button is pressed
void printTemp()
  for (int i = 0 ; i < EEPROM.length() ; i++) {
    byte value = EEPROM.read(i);                //read EEPROM data at address i
    if(value != 0)                              //skip "empty" addresses
      float temp = value*conv_coeff;            //convert ADC values to temperature
      temp = (temp - 0.5)*100;                  //take care of the offset
void clearEEPROM()
  for (int i = 0 ; i < EEPROM.length() ; i++) {
    if(EEPROM.read(i) != 0)                     //skip already "empty" addresses
      EEPROM.write(i, 0);                       //write 0 to address i
  Serial.println("EEPROM erased");
  address = 0;                                  //reset address counter
void writeTemp()
  byte value = analogRead(tempPin);     //read sensor value
  EEPROM.write(address, value);         //write value to current address counter address
  Serial.print("Sensor value stored at address ");
  address++;                      //increment address counter
  if(address == EEPROM.length())  //check if address counter has reached the end of EEPROM
    address = 0;              //if yes: reset address counter

Those are called function prototypes. They mean "These functions exist somewhere else". That "somewhere else" could be later on in the same file, or a different file entirely.

Usually these kind of things are provided by header (.h) files, or are automatically created (for functions in the INO file) by the IDE and hidden from you, so you never really see them. But if you're not using the IDE then you need to have them so your code (which is parsed linearly) knows that these functions exist before the parser comes across them.

  • Thanks! is it recommened to write it in the code? Even when using IDE? Apr 30 '20 at 11:31
  • 1
    It's a good habit to get into for when you graduate and start programming properly ;)
    – Majenko
    Apr 30 '20 at 11:46
  • @Majenko, ouch. We all have to learn sometime!
    – Duncan C
    Apr 30 '20 at 12:49
  • 2
    @DuncanC All I'm saying is that many Arduino users are students, and when you graduate and get a job certain standards will be expected of you ;)
    – Majenko
    Apr 30 '20 at 13:16

Originally, C (from which C++ inherited the bulk of its syntax) was compiled by a single-pass compiler: the compiler only got one look at the code.

A multi-pass compiler could look over the code and collect function definitions in one pass, then in a later pass, compile the code that calls those functions, or detect errors in those calls, if there are any.

A single pass compiler couldn't do that so it needs either the function or its prototype to appear before any code that uses calls it, for the compiler to have that same information when it needs it.

The prototype provides the function's name, the number and types of its arguments, and the type of value it returns, which is what the compiler needs to confirm and compile a function call or to issue a diagnostic message if the call doesn't match the prototype.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.