- 论坛徽章:
- 0
|
引自LDD 第10章
Assigning an Explicit Size to Data Items
Sometimes kernel code requires data items of a specific size, either to match predefined binary structures[39] or to align data within structures by inserting "filler'' fields (but please refer to "Data Alignment" later in this chapter for information about alignment issues).
[39]This happens when reading partition tables, when executing a binary file, or when decoding a network packet.
The kernel offers the following data types to use whenever you need to know the size of your data. All the types are declared in <asm/types.h>, which in turn is included by <linux/types.h>:
u8; /* unsigned byte (8 bits) */
u16; /* unsigned word (16 bits) */
u32; /* unsigned 32-bit value */
u64; /* unsigned 64-bit value */
These data types are accessible only from kernel code (i.e., _ _KERNEL_ _ must be defined before including <linux/types.h>). The corresponding signed types exist, but are rarely needed; just replace u with s in the name if you need them.
If a user-space program needs to use these types, it can prefix the names with a double underscore: _ _u8 and the other types are defined independent of _ _KERNEL_ _. If, for example, a driver needs to exchange binary structures with a program running in user space by means of ioctl, the header files should declare 32-bit fields in the structures as _ _u32.
It's important to remember that these types are Linux specific, and using them hinders porting software to other Unix flavors. Systems with recent compilers will support the C99-standard types, such as uint8_t and uint32_t; when possible, those types should be used in favor of the Linux-specific variety. If your code must work with 2.0 kernels, however, use of these types will not be possible (since only older compilers work with 2.0).
基本就是说为了一些需要精确位数的数据类型独立于平台(包括硬件,系统和编译器)。
- #if PLATFORM_INT_SIZE!=32
- #if PLATFORM_LONG_SIZE==32
- typedef long u32;
- #elif PLATFORM_LONG_LONG_SIZE==32
- typedef long long u32;
- #endif
- #else
- typedef int u32;
- #endif
- int a=sizeof(u32);
复制代码
这样可以保证a的值肯定是4...
[ 本帖最后由 zalem 于 2005-12-19 22:41 编辑 ] |
|