About .INO and .CPP Files in Visual Micro

The difference between the two file types

Both file extensions, .INO and .CPP, relate to source files, there is no difference in the file format or any difference in the programming language, but there are differences in how Visual Micro handles the files during compilation.

Note IconNote:

Every project must have one main sketch file, which must be an .INO file. This is the file containing the setup() and loop() functions. This main .INO file must have the same name as the project itself, e.g. if your project is named "MyRobot", then your main .INO file must be called MyRobot.INO.

.INO files

As long as you are using .INO files it does not matter how you distribute your functions among the files and how they are ordered within them. This makes programming easier, which is the idea behind .INO files.

However, as your project becomes larger and more complex, you might experience certain limitations of the .INO approach, especially if you are starting to use certain elements common to the C++ language like typdefs or global variables. This will be the time when you should consider switching to .CPP and .H files.

Note IconNote:

If you are using .INO files, you should follow these rules to avoid problems with compilation:

1. Put all global variables and objects into the main .INO file (the one that has the same name as your project)
2. If you want to use user defined data types like your own classes, structs or typedefs as arguments to functions, then you must write function prototypes, like it is common with .CPP files (Read more about function prototypes)

You can choose that .INO files shall behave just like .CPP files by switching the "Generate Prototypes" setting in the Project Properties to "false".

.CPP and .H files

Even though the Arduino web site does not mention it, the programming language Arduino uses is nothing but C++, with some limitations due to the tight memory constraints of the processors used.

Every user that is familiar with C or C++ should use .CPP and .H files in all but the simplest projects, because they show a behavior he is familiar with.

When using .CPP files, some "magic" of the .INO files does not apply. That's why the user must care about typical C/C++ constructs like function prototypes. At the end of the day, the larger the project gets, the more sense it makes to switch to .CPP/.H files.

Which file type shall I use?

(This question is irrelevant as long as you have only one source file, which must always be an .INO file.)

In a nutshell:

  • If you don't want to learn about C++ declarations and header files, stay with .INO files
  • If you have a more complex sketch with many separate source files that use classes and methods from each other, you will have more control and overview if you use "classic" C++ .CPP and .H files

How Visual Micro handles the files during compilation

.INO files

Before compilation, Visual Micro concatenates all .INO files in your project in alphabetical order into one big .INO file. In this alphabetical order, all upper case letters are preceding the lower case letters. Example: The files messages.INOanalog.INO, and Digital.INO are concatenated into one singe file in this order: Digital.INO, analog.INO, messages.INO (note the upper/lower case in the file names).

Exception: The main sketch file is always the first in this order, regardless of alphabetical order.

Note IconNote:

This way of handling .INO files might seem somewhat counterintuitive, but Visual Micro tries its best to mimic the way the original Arduino IDE does it, to ensure maximum compatibility with existing projects when migrating from the original IDE to Visual Micro.

To relieve the user from writing function prototypes, Visual Micro automatically generates them for all functions in all .INO files and puts them at the head of the combined .INO file.

After that combination step, the resulting, combined .INO file is compiled as one large file.

.CPP files

.CPP are treated as with every common C++ compiler: They are compiled one after another. The order how the files are compiled does not matter, because every .CPP file is treated separately.

Visual Micro does not automatically create function prototypes for .CPP files, so you must take care of them using header (.H) files, like it is common with C++.

What are function prototypes?

Read this Wikipedia page to learn about function prototypes.