svn commit: r211221 - head/usr.sbin/acpi/acpidump

Bruce Evans brde at optusnet.com.au
Fri Aug 13 14:35:22 UTC 2010


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

> Bruce Evans <brde at 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


More information about the svn-src-all mailing list