title: Is int main() { } (without "void") valid and portable in ISO C?
body: <p>The C standard specifies two forms of definition for <code>main</code> for a
  hosted implementation:</p>
  
  <pre><code>int main(void) { /* ... */ }
  </code></pre>
  
  <p>and</p>
  
  <pre><code>int main(int argc, char *argv[]) { /* ... */ }
  </code></pre>
  
  <p>It may be defined in ways that are "equivalent" to the above (for
  example, you can change the parameter names, replace <code>int</code> by a typedef
  name defined as <code>int</code>, or write <code>char *argv[]</code> as <code>char **argv</code>).</p>
  
  <p>It may also be defined "in some other implementation-defined manner"
  -- which means that things like <code>int main(int argc, char *argv[],
  char *envp)</code> are valid <em>if</em> the implementation documents them.</p>
  
  <p>The "in some other implementation-defined manner" clause was not in
  the 1989/1990 standard; it was added by the 1999 standard (but the
  earlier standard permitted extensions, so an implementation could
  still permit other forms).</p>
  
  <p>My question is this: Given the current (2011) ISO C standard, is a
  definition of the form</p>
  
  <pre><code>int main() { /* ... */ }
  </code></pre>
  
  <p>valid and portable for all hosted implementations?</p>
  
  <p>(Note that I am not addressing either <code>void main</code> or the use of
  <code>int main()</code> without parentheses in C++.  This is just about the
  distinction between <code>int main(void)</code> and <code>int main()</code> in ISO C.)</p>