1. 预处理器
1.1. 变体宏
对于变体宏来说,坚持使用类似C99的语法:
#define DPRINTF(fmt, ...) \
do { printf("IRQ: " fmt, ## __VA_ARGS__); } while (0)
1.2. include指令
按照顺序的include指令使用如下:
#include "qemu/osdep.h" /* Always first... */
#include <...> /* then system headers... */
#include "..." /* and finally QEMU headers. */
"qemu/osdep.h"包含预处理器宏,这些宏影响核心的系统头文件,比如<stdint.h>。该头文件必须第一个被include,以使被其他函数库所引用的核心系统头文件可以得到正确的qemu依赖的预处理宏。
不要在.h文件中include “qemu/osdep.h”,因为.c文件中已经include了。
2. C 类型
关于使用正确的数据类型,已经有一些共识存在,我们也在这里收集了一些有用的指导。
2.1. 常量类型
如果你正在使用"int"或者"long",无符号数是一个很好的类型。如果一个变量是一个计数器,它应该是一个unsigned类型。
如果变量是memory-size相关的,size_t应该是一个很好的选择(没有特殊要求只使用ssize_t)。客户机RAM内存偏移的表示使用ram_addr_t,但是只是限于RAM,该类型可能不会覆盖整个的客户机地址空间。
如果它是一个file-size相关的,使用off_t。
如果它是file_offset相关的,使用off_t。
如果它只包含小的数字,使用"unsigned int"(在除了嵌入式系统外,你能够假设这个类型至少4个字节长)。
如果你需要一个特殊宽度的类型,使用一个标准的类型,比如:int32_t, uint32_t, uint64_t等。这些特殊的类型被强制性包含进了VMState结构体中。
不要使用Linux内核的内部类型,比如:u32, __u32或 __le32。
客户机物理地址使用hwaddr(PCI地址使用pcibus_t&#
1.1. 变体宏
对于变体宏来说,坚持使用类似C99的语法:
#define DPRINTF(fmt, ...) \
do { printf("IRQ: " fmt, ## __VA_ARGS__); } while (0)
1.2. include指令
按照顺序的include指令使用如下:
#include "qemu/osdep.h" /* Always first... */
#include <...> /* then system headers... */
#include "..." /* and finally QEMU headers. */
"qemu/osdep.h"包含预处理器宏,这些宏影响核心的系统头文件,比如<stdint.h>。该头文件必须第一个被include,以使被其他函数库所引用的核心系统头文件可以得到正确的qemu依赖的预处理宏。
不要在.h文件中include “qemu/osdep.h”,因为.c文件中已经include了。
2. C 类型
关于使用正确的数据类型,已经有一些共识存在,我们也在这里收集了一些有用的指导。
2.1. 常量类型
如果你正在使用"int"或者"long",无符号数是一个很好的类型。如果一个变量是一个计数器,它应该是一个unsigned类型。
如果变量是memory-size相关的,size_t应该是一个很好的选择(没有特殊要求只使用ssize_t)。客户机RAM内存偏移的表示使用ram_addr_t,但是只是限于RAM,该类型可能不会覆盖整个的客户机地址空间。
如果它是一个file-size相关的,使用off_t。
如果它是file_offset相关的,使用off_t。
如果它只包含小的数字,使用"unsigned int"(在除了嵌入式系统外,你能够假设这个类型至少4个字节长)。
如果你需要一个特殊宽度的类型,使用一个标准的类型,比如:int32_t, uint32_t, uint64_t等。这些特殊的类型被强制性包含进了VMState结构体中。
不要使用Linux内核的内部类型,比如:u32, __u32或 __le32。
客户机物理地址使用hwaddr(PCI地址使用pcibus_t&#