The OP is very confused about terminology. "initiating" a function is a meaningless term. A function can be declared. A function can be defined. A function can be called, or invoked. It cannot be "initiated".
A declaration does nothing more than tell the compiler that somewhere, you will be defining a function with the given name. That function will accept the given arguments, and return the given return type. For example:
void printMe(char *s);
This is a declaration that tells the compiler somewhere further down in the program you will define a function named "printMe", and that function will take a pointer to a character string as an argument, and will return nothing. It says NOTHING about WHAT that function does, or HOW it does it.
void printMe(char *s)
{
Serial.println(s);
}
This is a definition of the function printMe. The function name, number and type of arguments, and return type MUST hatch the declaration. The definition DEFINES WHAT the function does, and HOW it does it.
Elsewhere in the program, you can call, or invoke, the function:
void loop()
{
printMe("hello, world!");
}
This is where the function actually gets executed.
Once the function has been declared, it can be referenced in the following code, even if it has not yet been defined, since the compiler knows from the declaration the name, number and type of arguments, and return type from the declaration. You cannot reference a function that has not yet been declared.
If you declare the function, but never define the function, then the compile will FAIL when it reaches the link phase, which is where it actually creates the executable code. The link will FAIL because you've told the compiler you would be providing the definition of a function called printMe, but you never did. So, it has NO code for the function.
If you DEFINE a function before CALLING the function, then the definition IS the deslaration, and a separate declaration is not required. So, best practice is to put all function definitions near the top of the file BEFORE defining any functions that call them, though this is not always possible, when you have many functions calling many other functions.
In Arduino, it is almost never necessary for the user to declare functions in an ino file. The build system will create the necessary declarations as one of the first steps of the compilation process. This is NOT standard c/c++ behavior, but it unique to the Arduino build process to make life easier for "newbies". It also creates a LOT of problems....
Regards,
Ray L.