I have a couple of questions regarding § 5.1.2.2.2 in the standard.

> 
> 1. The function called at program startup is named **main**. The implementation declares no prototype for this function. It shall be
>  defined with a return type of **int** and with no parameters: 
> 
> 
> `int main(void) { /* ... */ }`
> 
> 
> or with two parameters (referred to here as
>  **argc** and **argv**, though any names may be used, as they are local to the
>  function in which they are declared): 
> 
> 
> `int main(int argc, char *argv[]) { /* ... */ }`
> 
> 
> or equivalent;10) or in some other
>  implementation-defined manner.
> 
> 
> 

What does "some other implementation-defined manner" refer to? Does it refer to footnote 10, which states:

> 
> Thus, **int** can be replaced by a typedef name defined as **int**, or
>  the type of **argv** can be written as **char \*\* argv**, and so on.
> 
> 
> 

...or the actual definition of main? If so, does this mean that given a certain implementation, the compiler can say `main` should be defined however it wants (this runs contrary to what I've read on the internet saying it must be `int main`. For example, in § 5.1.2.2.3 it states: 

> 
> 1. If the return type of the **main** function is a type compatible with **int**, a return from the initial call to the **main** function is equivalent
>  to calling the **exit** function with the value returned by the **main**
>  function as its argument;11) reaching the **}** that terminates the **main**
>  function returns a value of 0. If the return type is not compatible
>  with **int**, the termination status returned to the host environment is
>  unspecified.
> 
> 
> 

...which seems to leave a lot of leeway to the implementation.

> 
> — The parameters **argc** and **argv** and the strings pointed to by
>  the **argv** array shall be modifiable by the program, and retain
>  their last-stored values between program startup and program
>  termination.
> 
> 
> 

What does "retain their last-stored values mean"? Does this mean functions like [`getopt`](http://linux.die.net/man/3/getopt) violate the standard because they permute argv?