Thank you Crystal & Claudio for taking the time to explain.

On Mon, Mar 09, 2026 at 04:14:02PM +0100, Claudio Jeker wrote:
> On Mon, Mar 09, 2026 at 12:30:01PM +0000, Crystal Kolipe wrote:
> > On Mon, Mar 09, 2026 at 06:57:07AM +0100, Claudio Jeker wrote:
> > > On Sun, Mar 08, 2026 at 07:14:10PM -0300, Gustavo Rios wrote:
> > > > Hi folks!,
> > > > 
> > > > what is the option of choice for openbsd developer :
> > > > 
> > > > int main()
> > > 
> > > This is no longer valid C. This should be int main(void).
> > 
> > This is an oversimplification.
> > 
> > I know what you mean, and for the purposes of the OP writing userland code 
> > on
> > OpenBSD, it's enough.  But for the benefit of other readers of this list who
> > might try to extend this to a general observation about C programming, it
> > would be good to make it more detailed:
> > 
> > When an OS provides for main() being the entry point, the main() function is
> > supposed to take either no arguments, or exactly two.
> > 
> > (At least according to all moderately recent C standards.)
> > 
> > What has changed is that, until recently, defining _any_ function with an
> > empty parameter list allowed you to pass a variable number of parameters to
> > it.
> > 
> > So you could do things like:
> > 
> > int foo()
> > {
> > return (0);
> > }
> > 
> > int bar()
> > {
> > foo(1, 2, 3);
> > return (0);
> > }
> > 
> > You would get a loud compiler warning, but the code would still compile and
> > run.  Doing this has been deprecated since around the time of C11.
> > 
> > This all comes as a surprise to many people who thought that an empty
> > parameter list meant 'no parameters', whereas it actually meant,
> > 'unspecified', and the correct way to define a function with no parameters
> > was, (and still is):
> > 
> > int foo(void) {}
> > 
> > Of course, passing zero parameters to a function that can accept any number,
> > (including zero), worked.  But it's better to have things more strictly
> > defined so that logic errors can be found at compile time, etc, etc.
> > 
> > Note that main() is _not_ special in this case.  Any function is treated the
> > same way.
> > 
> > Anyway, recent C standards changed the meaning of an empty parameter list to
> > be equivalent to a parameter list with just 'void'.  So the following two
> > would be equivalent:
> > 
> > int foo()
> > int foo(void)
> > 
> > ... and the example code above that called foo() with parameters would throw
> > a compiler error rather than just a warning.
> > 
> > @claudio - has the equivalence of () and (void) been changed in a _very_
> > recent version of the C standard that I have not seen?  My understanding is
> > that () has not been deprecated, (yet)?  Surely using main() is now 
> > perfectly
> > valid, (with the new definition), as the previously obsoleted meaning of an
> > empty parameter list longer exists?
> 
> It is the forcing of foo() to foo(void) that I was referring to. It is a
> breaking change in C23 and if you already cleaning up do it right.
> The very old K&R function declarations need to die. This one is one of
> them (especially when functions are incorrectly declared this way).
> 
> I expect compilers will become more and more annoying about these old
> constructs. So don't be lazy and add the void.
>  
> -- 
> :wq Claudio
> 

-- 
All desire is the desire to be desired by the subject presumed to know.

Reply via email to