C function with no parameters behavior

Can somebody explain to me why the following code does compile without a warning or error?

I would expect the compiler to warn me that the function no_args doesn't expect any arguments.

But the code compiles and runs function no_args recursively.

static void has_args(int a, int b, int c) { 
    printf("has_args\n");
}

static void no_args() {
    printf("no_args\n");
    no_args(1, 2, 3);
}

void main() {
  no_args();
}

In C++, void no_args() declares a function that takes no parameters (and returns nothing).

In C, void no_args() declares a function that takes an unspecified (but not variable) number of parameters (and returns nothing). So all your calls are valid (according to the prototype) in C.

In C, use void no_args(void) to declare a function that truly takes no parameters (and returns nothing).


When you declare a function with an empty argument list, you invoke K&R (pre-prototype) semantics and nothing is assumed about the parameter list; this is so that pre-ANSI C code will still compile. If you want a prototyped function with an empty parameter list, use (void) instead of ().