To enforce the check for errors and type mismatch when passing parameters to a function or using the return values the C99 standard require that you explicitely declare the type of variables involved in your functions. The knowledge of this info's allows the compiler to check for errors. For example if you are trying to pass a char pointer where an int is required. Moreover it allows compiler to make automatic conversion for the compatible types (i.e int to float, float to double, etc).
The way you tell (declare) to the compiler which types of data your function requires as parameters, and which type of data the function give back as a result is called a prototype.
A prototype is the header line of a function without the body (you can just copy the header and terminate it with ";").
I.e.
int myfunc(int a, float b);
int myfunc(int a, float b)
{
return a + b;
}
In the sample above the first time the function appears it acts as a prototype, it tells the compiler how many parameters requires, which data type are required for parameters and which type of data returns.
So when you use the function the compiler can check if all values are compliant or compatible and give you warning or errors if the number of arguments is wrong, or the data types are incompatible and so on.
A prototype to be effective have to appear of course before you call the function. if you put the prototype after the compiler don't know yet the function characteristics and cannot make any check.
If no prototype exist, or is misplaced (after call) the compiler assumes K&R syntax that states that when a data type is unknown it would be assumed to be an int. Of course if your data is float, double or a pointer the result will be disastrous.
The prototypes are generally put in an include file (.h) and included at beginning of your program (like: #include <stdio.h>) so they are available to the compiler before any line of your code.
The prototypes are largely used to allow checking against library code where source is not available.
If take a look to stdio.h for example you'll find a lot of library functions prototypes.
Last thing, in prototypes you can omit the variable names becouse the compiler need to know the types of data and don't care about the name you assigned to them. So myfunc prototype can be written also:
int myfunc(int, float);
The C99 defines the standard names for library functions. M$ put in its compiler many functions specific for the use on M$DOS and WINDOWS systems that becomes a defacto standards only for M$ systems, but the C99 standard has never included that functions in the standard set.
PelleC intend to be fully compliant with C99 standard, so that functions are renamed, generally prefixing an underscore to the M$ name. Anyway to allow the compilation of old pieces of code without a lot of changes, and also to keep compliance with actual M$ compilers, has been added the compatibility names switch for this purpose as Stefan said.