how to kernel printf a int64_t?

Rick Macklem rmacklem at uoguelph.ca
Sun Nov 2 12:48:20 UTC 2014


Ian Lepore wrote:
> On Sun, 2014-11-02 at 11:20 +0800, Julian Elischer wrote:
> > On 11/2/14, 10:14 AM, Rick Macklem wrote:
> > > Julian Elischer wrote:
> > >> On 10/31/14, 1:09 PM, Tim Kientzle wrote:
> > >>
> > >>
> > >> On Oct 30, 2014, at 2:01 PM, Rick Macklem <rmacklem at uoguelph.ca>
> > >> wrote:
> > >>
> > >> Hi,
> > >>
> > >> I feel kinda dumb asking this, but...
> > >>        int64_t i;
> > >>
> > >>        printf("%qd\n", (u_quad_t)i);
> > >>
> > >> works but looks dorky, to put it technically;-).
> > >> Is there a better way to printf() a int64_t in the kernel? I
> > >> often
> > >> use the following to print large integers:
> > >>
> > >>      printf(“%jd\n”, (intmax_t)i); the "cannonical' way is to
> > >>      use
> > >>      PRIu64 and friends, but some people seem to have a problem
> > >>      with
> > >>      doing that.
> > >>
> > > Ok, so now I need to ask another dumb question.
> > > How do you do this in the kernel?
> > > (I can see them defines in <machine/_inttypes.h>, but including
> > > that
> > >   doesn't help, which isn't surprising since PRIu64 is in a
> > >   string
> > >   and won't be recognized as a macro.)
> > 
> > you use it with string concatenation.
> > like:
> > 
> >    printf (" this is a 64 it unsigned value:  %" PRIu64 " and I
> >    just
> > printed it\n", thingy64);
> > 
> > After substitution the compiler sees
> >   " this is a 64 it unsigned value: %" "llu" " and I just printed
> >   it\n"
> > which simplifies to:
> > " this is a 64 it unsigned value: %llu and I just printed it\n"
> > 
> > due to concatenation. (note I didn't actually look what PRIu64
> > evaluates to)
> > 
> > 
> 
> Which is exactly the explanation for why "some people seem to have a
> problem with doing that."  "Some people" would be "anyone who thinks
> it
> should be possible to read code as well as write it."  This may be
> more
> correct in some pedantic sense, but %j and a cast is more readable.
> 
Yes, thanks. I'll admit to thinking exactly the same thing.
I guess I'll use %j.

Thanks everyone for your help, rick

> -- Ian
> 
> > >
> > > Oh, and is intmax_t going to be int64_t on all arches?
> > >
> > > Thanks, rick
> > >
> > >>
> > >> Tim
> > >>
> > >> _______________________________________________
> > >> freebsd-hackers at freebsd.org mailing list
> > >> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To
> > >> unsubscribe, send any mail to
> > >> "freebsd-hackers-unsubscribe at freebsd.org"
> > >>
> > >
> > >
> > 
> > _______________________________________________
> > freebsd-hackers at freebsd.org mailing list
> > http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> > To unsubscribe, send any mail to
> > "freebsd-hackers-unsubscribe at freebsd.org"
> > 
> 
> 
> _______________________________________________
> freebsd-hackers at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to
> "freebsd-hackers-unsubscribe at freebsd.org"
> 


More information about the freebsd-hackers mailing list