When you define a variable outside of any function, you can still use it inside a function. This is an example of a global variable: it is defined in (and thus can be used in) all scopes (a scope is the region of code that has access to an element):
#include <iostream>
// A variable defined outside of any function (a 'global variable')
std::string greeting = "Hello World";
void my_function() {
// Use a global variable
std::cout << greeting << "\n";
}
int main() {
// Use a global variable
std::cout << greeting << "\n";
my_function();
}
Hello World
Hello World
However, if you define a variable inside of a function, you can only use it in that function (even if you call a function from within that function, you would need to pass it in as an argument in order to use it). This is an example of a local variable: it is defined in (and thus can only be used in) one scope - the function itself:
#include <iostream>
// A variable defined outside of any functions (a 'global variable')
std::string greeting = "Hello World";
void my_function() {
// This won't work!
std::cout << reply << "\n";
}
int main() {
// Use a global variable
std::cout << greeting << "\n";
// Initialise a local variable
std::string reply = "Hello User";
my_function();
}
error: ‘reply’ was not declared in this scope
You need to pass local variables into functions as arguments, or return them from functions as return values, before you can use them in a different scope:
#include <iostream>
#include <string>
std::string my_function(std::string message) {
// Use the variable passed in
std::cout << message << "\n";
// Initialise a local variable
std::string reply = "Hello User";
// Return the local variable
return reply;
}
int main() {
// Initialise a local variable
std::string greeting = "Hello World";
// Pass argument in and get value out
std::string message = my_function(greeting);
// Use the returned variable
std::cout << message << "\n";
}
Hello World
Hello User
If your programme is long and has many functions, it’s usually better to separate some of them out into different files. These files will then need to be included as ‘headers’ at the top of your source code:
main.cpp:
#include <iostream>
// Include the other file where the function(s) are defined
#include "functions.cpp"
int main() {
// Initialise a local variable
std::string greeting = "Hello World";
// Pass argument in and get value out
std::string message = my_function(greeting);
// Use the returned variable
std::cout << message << "\n";
}
functions.cpp:
std::string my_function(std::string message) {
// Use the variable passed in
std::cout << message << "\n";
// Initialise a local variable
std::string reply = "Hello User";
// Return the local variable
return reply;
}
Running main.cpp
will give you:
Hello World
Hello User
The string Hello World
was created in the main
function which is in the main.cpp
file, but it was printed in the my_function
function which is in the functions.cpp
file.
The string Hello User
was created in the my_function
function which is in the functions.cpp
file, but it was printed in the main
function which is in the main.cpp
file.
Using the inline
statement will, when the code is compiled, cause a function’s body to be inserted into where the function gets called. This might make the execution speed faster or slower, depending on the exact programme itself.
functions.cpp:
inline
std::string my_function(std::string message) {
// Use the variable passed in
std::cout << message << "\n";
// Initialise a local variable
std::string reply = "Hello User";
// Return the local variable
return reply;
}
Confusingly, the phrase inline function also refers to a function that is so short it gets defined on one line:
std::string my_function(std::string message) {std::cout << message << "\n";}