[cfe-dev] char and const char erroring out
Jeroen Ruigrok van der Werven
asmodai at in-nomine.org
Tue Jul 24 10:25:32 PDT 2007
With a lot of Unix userland utilities this is a common occurence:
#include <unistd.h>
int
main(int argc, char *argv[])
{
int ch;
while ((ch = getopt(argc, argv, "h")) != -1) {
switch (ch) {
case 'h':
return (-1);
}
}
return (0);
}
[19:14] [asmodai at nexus] (1150) {18} % clang test.c
test.c:8:28: error: incompatible types passing 'char *[]' to function expecting 'char *const []'
while ((ch = getopt(argc, argv, "h")) != -1) {
~~~~~~ ^~~~
Well, it is correct yes, argv is a char *argv[] and the prototype of getopt()
is as follows:
int getopt(int argc, char * const argv[], const char *optstring);
But in this case I think error is a pretty hefty one. You would not be able to
compile any of the userland tools within any BSD like this. :)
One could argue that the main call would need to be:
int main(int argc, char * const argv[])
But C99 5.1.2.2.1 says:
"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; or in some other implementation-defined manner."
and
"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."
so that solution is a no-no since it would not be compliment to the last
paragraph.
--
Jeroen Ruigrok van der Werven <asmodai(-at-)in-nomine.org> / asmodai
イェルーン ラウフロック ヴァン デル ウェルヴェン
http://www.in-nomine.org/ | http://www.rangaku.org/
If you would thoroughly know anything, teach it to others...
More information about the cfe-dev
mailing list