The main() function is special in C and C++ programs: it provides the means for other programs (such as a shell) to call the executable program. Therefore, when you link a bunch of object files together (*.o files) into an executable, exactly one of them must define a main() function.

The function type of int(int,char *[]) matches the convention that when the resulting function is called, its arguments will be passed as an array of C strings in the second argument, the number of arguments in the first argument, and its return value will be passed to the environment as an integer return code, where the value of 0 is interpreted as success and anything else as the indication of some error. So even if your C compiler accepts a different declaration for this function, it will still be called in this way by the calling environment, unless you wrote that environment yourself and made it use a nonstandard calling convention, a practice that would earn you the eternal scorn and contempt of every C programmer on earth.