Re: [PATCH 1/3] diff --stat: allow custom diffstat output width.
- From
Linus Torvalds <torvalds@osdl.org>
- Date
- Sep 29, 2006, 06:17 UTC
- Message-ID
- <Pine.LNX.4.64.0609282307220.3952@g5.osdl.org>
- In-Reply-To
- <Pine.LNX.4.64.0609282252430.3952@g5.osdl.org>
On Thu, 28 Sep 2006, Linus Torvalds wrote:
Show 5 quoted lines
> > because the only reason strtoul() warns now is that C type-rules don't > allow the (obviously safe - but pointers migth have strange > representations) conversion of "char **" into "const char **", even though > "char *" can be converted into "const char *".
I phrased that badly.
IF C pointer conversion allowed implicit addition of "const" past the top-most level, ANSI C would have just done "strtoul()" as
unsigned long strtoul(const char *n, const char **p, int);
ie they could just have added the "const" not just to the first argument, and legact programs (without const) would still have worked fine.
But _because_ that's not how C type rules work, we have the current situation where the first argument is a "const char *", and the second argument _logically_ should be a pointer to such an entity, but because that would have caused bogus warnings for any code that just used a regular "char **" without any const at all, that wasn't an option.
So that explains why ANSI C has insane imbalances like this. It's easy to add a "const" to a _first-level_ pointer to say "we allow both const and regular pointers to this thing", but sadly you can't do it for a pointer to such a pointer.
Linus