u32 __u32 - 内核源码 - Linux论坛

导读:

看到内核中有的 .h 文件中有下面的定义




[Copy to clipboard] [ - ]
CODE:

typedef unsigned int __u32;
typedef unsigned int u32;


我不明白
1、程序为什么有的用 u32,而有的却用 __u32 呢?
2、为什么不直接 unsigned int xxx 或者 unsigned char xxx,而用 u32 u8 定义变量呢?



 



QUOTE:

引自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 , which in turn is included by :

    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 ). 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).


基本就是说为了一些需要精确位数的数据类型独立于平台(包括硬件,系统和编译器)。




[Copy to clipboard] [ - ]
CODE:

#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...

本文转自
http://linux.chinaunix.net/bbs/viewthread.php?tid=672196

你可能感兴趣的:(u32 __u32 - 内核源码 - Linux论坛)