On Fri, 13 Aug 2010, [utf-8] Dag-Erling Sm??rgrav wrote:

Bruce Evans <b...@optusnet.com.au> writes:
- `platform_class' has type uint16_t.  u_int is larger than that on all
  supported machines, and also on unsupported ones with 16-31 bit u_ints.
  Thus the cast has almost no effect, and has no effect on the result.

you have to cast it to *something*, unless you're willing to assume
blindly that uint16_t == unsigned short (and use %h).

No, all function parameters are converted to *something*, and as I partly
explained above, the default something is always int or u_int, with the
lofical sign error for the int not causing any problems.  Various cases:
- K&R compiler, or C90-C99 compiler with no prototype in scope: integer
  parameters are converted to int or  u_int if they are smaller than that
  to start, else they are not converted.
- variadic function for a parameter after `...': same as for K&R.
- %h format for printf: makes little or no difference except for bogus
  parameters.  The parameter must end up as int or u_int after the default
  promotion.  The %h causes the parameter to be downcast to short or u_short.
  This is different from taking a short or u_short parameter.  You just
  can't pass a short or a u_short to a variadic function,
Here uint16_t is converted to u_int on machines with 16-bit ints, else it
is converted to int.

Anyway, almost all typedefed types should be cast to [u]intmax_t for
printing, so that you don't have to know too much about what they are.

long or even int is fine in many cases, e.g. uid_t, mode_t

Though it works now, it might break someday.  32-bit ino_t and printing
it with %u should have broken already.

Bruce
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to