NetBSD-Users archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: C portability question
In article <20080512004311.472c9703%yellowstone.machshav.com@localhost>,
Steven M. Bellovin <smb%cs.columbia.edu@localhost> wrote:
>On Sun, 11 May 2008 20:35:39 -0400
>"Greg A. Woods; Planix, Inc." <woods%planix.ca@localhost> wrote:
>
>>
>> On 11-May-08, at 7:49 PM, Steven M. Bellovin wrote:
>>
>> > Working on a package, I had problems with (in effect)
>> >
>> > off_t var;
>> > printf("%ld\n", var);
>> >
>> > This crashes on netbsd-i386, since our longs are 4 bytes. (I didn't
>> > quite see what off_t is, but it's 8 bytes long.)
>> >
>> > Anyway -- what is the portable way to printf an off_t, which is (of
>> > course) an opaque type. I could cast (var) to (long), but that's
>> > clearly wrong (and in fact loses data here for us).
>>
>> C99 defines printf (and scanf) format specifiers for various integer
>> types (which you'll find actually defined in <machine/int_fmtio.h>
>> on NetBSD since 1.6):
>>
>> #include <sys/types.h> /* for off_t */
>> #include <inttypes.h>
>> #include <limits.h>
>> #include <stdint.h>
>> #include <stdio.h>
>>
>> off_t var = INT64_MAX;
>>
>> /* assert(sizeof(off_t) <= sizeof(int64_t)); */
>>
>> printf("%" PRId64 "\n", (int64_t) var);
>>
>> Without C99 though (on at least I32/LP32 architectures) you may be
>> stuck with trying to figure out if the compiler supports "long long"
>> or similar and what printf() offers for printing "long long" (eg.
>> "%q", assuming of course sizeof(off_t) is also actually greater than
>> 4 on the target platform.
>>
>Thanks, that helps -- but what is the format specifier for off_t?
>After all, I don't know what type it is. I see your assert(), but that
>strikes me as ugly. I could, I guess, just cast to int64_t, since in
>this context anything larger is highly unlikely (it's the size of a
>mail message, and I don't think people are receiving >2^64 bytes of
>mail in one message...)
There isn't one (yet) like there is for ptrdiff_t {t} and size_t {z}.
The best you can do is:
printf("%lld", (long long)var);
since you know off_t is signed.
christos
Home |
Main Index |
Thread Index |
Old Index