Re: Use of C99 int types

From: Renate Meijer
Date: Tue Apr 05 2005 - 04:22:44 EST



On Apr 4, 2005, at 11:49 PM, Kyle Moffett wrote:

On Apr 04, 2005, at 17:25, Richard B. Johnson wrote:
I don't find stdint.h in the kernel source (up to 2.6.11). Is this
going to be a new addition?

Uhh, no. stdint.h is part of glibc, not the kernel.

It would be very helpful to start using the uint(8,16,32,64)_t types
because they are self-evident, a lot more than size_t or, my favorite
wchar_t.

You miss the point of size_t and ssize_t/ptrdiff_t. They are types
guaranteed to be at least as big as the pointer size.

IIRC, It is guaranteed that size_t can correctly represent the largest object which
can be malloced. This usually coincides with the width of a pointer, but not
neccesarily.

uint8/16/32/64,
on the other hand, are specific bit-sizes, which may not be as fast or
correct as a simple size_t.

Using specific widths may yield benefits on one platform, whilst proving a real
bottleneck when porting something to another. A potential of problems easily
avoided by using plain-vanilla integers.

Linus has pointed out that while it
doesn't matter which of __u32, u32, uint32_t, etc you use for kernel
private interfaces, you *cannot* use anything other than __u32 in the
parts of headers that userspace will see, because __u32 is defined
only by the kernel and so there is no risk for conflicts, as opposed
to uint32_t, which is also defined by libc, resulting in collisions
in naming.

Strictly speaking, a definition starting with a double underscore is reserved for use
by the compiler and associated libs, this such a declaration would invade implementation
namespace. The compilers implementation, that is.

In this case, the boundary is a bit vague, i see that, since a lot of header definitions also reside
in the /usr/include hierarchy.

I think it would be usefull to at least *agree* on a standard type for 8/16/32/64-bit integer types. What
I see now as a result of grepping for 'uint32' is a lot more confusing than stdint.h

There is u32, __u32, uint32, uint32_t, __uint32_t...

Especially the types with leading underscores look cool, but in reality may cause a conflict with compiler
internals and should only be used when defining compiler libraries. The '__' have explicitly been put in by
ISO in order to avoid conflicts between user-code and the standard libraries, so if non-compiler-library code also starts using '__', just coz it looks cool, that cunning plan is undone.

Furthermore, I think it's wise to convince the community that if not needed, integers should not be specified
by any specific width.

Regards,

Renate Meijer.

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/