[
Lists Home |
Date Index |
Thread Index
]
David Tolpin scripsit:
> > Concrete example: if you declare
> >
> > int genxComment(genxWriter w, const utf8Byte * text);
> >
> > then a user of the genx API can pass either a 'const utf8Byte *'
> > or a plain 'utf8Byte *' to the routine, without any compiler
> > warnings.
> >
> > Conversely, if you declare:
> >
> > int genxComment(genxWriter w, utf8Byte * text);
> >
> > then users of the API can *only* pass plain, non-const 'utf8Byte *'s
> > to the routine. If they happen to have a 'const utf8Byte *',
> > then *they* need to do a cast, or copy to a non-const buffer,
> > or perform some other gyration.
>
> the problem is that it is not so. Take an ANSI C compiler, turn all warning
> on and try it.
I did, with the following test code:
1 void ccall(const char *p) { }
2 void pcall(char *p) { }
3
4 int main() {
5 const char cbuff[30];
6 char pbuff[30];
7
8 ccall(cbuff);
9 ccall(pbuff);
10 pcall(cbuff);
11 pcall(pbuff);
12 return 0;
13 }
(line numbers added). I ran gcc on this both with and without -Wall,
and got in each case:
contest.c: In function `main':
contest.c:10: warning: passing arg 1 of `pcall' discards qualifiers from
pointer target type
So Joe's claim looks exactly right: passing a const char array to a
function expecting a plain char array raises a warning; other combinations
do not. Granted that a cast will suppress this warning, but it will
suppress almost every type warning in C (you can't cast a function pointer
to something else, nor vice versa).
--
My confusion is rapidly waxing John Cowan
For XML Schema's too taxing: jcowan@reutershealth.com
I'd use DTDs http://www.reutershealth.com
If they had local trees -- http://www.ccil.org/~cowan
I think I best switch to RELAX NG.
|