Well, first of all, don't do it.
I refer to existing answers for how you would do it, they explain the different levels const
can be applied and how to write it in straight pointer syntax as well as in "disguised as an array"-syntax. That's definitely good to know.
But here it comes: main
is very special. According to the C standard, it doesn't have a prototype, but the definition should take one of two forms only. Here's the original text, from N1570, the latest draft to C11:
§ 5.1.2.2.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.
The footnote 10 even explains what equivalent means here:
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.
But as for adding some const
s, look for example at § 6.7.6.1 p2:
For two pointer types to be compatible, both shall be identically qualified and both shall
be pointers to compatible types.
(emphasis mine). const
is a type qualifier. So const char **
is not compatible with char **
. You define a main
that doesn't conform to the C standard any more. Therefore, just don't do it. Use const
correctness inside your program, but don't try changing the interface for program startup.
Side note: exactly the one const
you're asking about here might be ok, because it applies to the pointer itself, which is just a local variable to the function (as parameters are always by value in C function calls). So it doesn't change the function's interface. That's why in practice, nobody bothers adding such const
s. It's not important for calling code whether a function modifies its locals or not.