陈孝松注:K & R:《The C Programming Language》一书的作者 Kernighan 和 Ritchie。请注意,结束大括号单独一行,除非在其后跟着同一条语句的剩余部分,也就是do语句中的while,或者if语句中的else,例如:do { body of do-loop} while (condition);还有
陈孝松注:这里曾经还有一句话:难怪微软总是制造出有问题的程序。在 2021 年 2 月 12 日这句话被删除了。局部变量名称应简短明了。 如果你有一些随机整数循环计数器,则应命名为i。 如果没有可能被误解,则命名为loop_counter是无用的。 同样,tmp可以用来命名任意类型的临时变量。如果你害怕混淆你的局部变量名称,那么你会遇到另一个问题,称为叫做函数增长荷尔蒙失衡综合症function-growth-hormone-imbalance syndrome。 请参见第 6 章(函数)。
typedef通常,指针或结构体中的元素可以合理被访问到,那么就不应该是typedef。6) 函数
- 完全不透明的对象(这时 typedef主动用于隐藏对象是什么)。
例如:pte_t等不透明对象,你只能使用适当的访函数来访问他们。
注意:不透明和“访问函数”本身并不好。 之所以使用诸如pte_t等类型的原因在于真的是完全没有任何共用的可访问信息。
- 清楚的整数类型,这层抽象有助于避免混淆到底是int还是long。
u8/u16/u32是没问题的typedef,不过它们更符合情况 (4) 而不是这里。
再次注意:需要有一个原因。 如果某个变量类型是unsigned long,则没有必要这样typedef unsigned long myflags_t;
但是,如果有明确的原因,比如有些情况可能是unsigned int,而在其他情况下可能是unsigned long,那么一定要继续使用typedef。
- 当你使用 sparse从字面上创建用于类型检查的新类型时。
陈孝松注:sparse诞生于 2004 年,是由 Linus 开发的,目的就是提供一个静态检查代码的工具, 从而减少 Linux 内核的隐患。
- 在某些特殊情况下,与标准 C99 类型相同的新类型。
尽管眼睛和大脑只需要很短的时间就习惯了uint32_t这样的标准类型,但是仍然有人反对使用它们。
因此,Linux 特有的等同于标准类型的u8/u16/u32/u64类型和它们的有符号类型是被允许的 -- 尽管它们在你自己的新代码中不是必需的。
编辑已使用了某类型集的现有代码时,应遵循该代码中的现有选择。
- 可以在用户空间中安全使用的类型。
在用户空间可见的某些结构体中,我们不能要求C99类型而且不能用上面提到的u32类型。 因此,我们在与用户空间共享的所有结构体中使用__u32和类似的类型。
陈孝松注:GW-BASIC 是 BASIC 的一个方言版本,这个版本的 BASIC 最早是微软在 1984 年为康柏(2002 年康柏公司被惠普公司收购)开发的。使用int fun(int a){ int result = 0; char *buffer; buffer = kmalloc(SIZE, GFP_KERNEL); if (!buffer) return -ENOMEM; if (condition1) { while (loop1) { ... } result = 1; goto out_free_buffer; } ...out_free_buffer: kfree(buffer); return result;}要注意的一种常见错误是此代码中的错误是在某些出口路径上fooNULL。 通常,此问题的解决方法是将其分为两个错误标签err_free_bar:理想情况下,你应该模拟错误以测试所有出口路径。
陈孝松注:
RTL:寄存器传递语言register transfer language,又译为暂存器转换语言、寄存器转换语言,一种中间语言,使用于编译器中。
如果函数的名字是一个动作或者强制性的命令,则该函数应返回错误代码整数。 如果是一个判断,则函数应返回表示是否“成功”的布尔值。例如,add workadd_work0-EBUSY。 同样,PCI device present是一个判断,如果成功找到匹配的设备,pci_dev_present函数将返回所有 EXPORT函数必须遵守此约定,所有公共函数也应遵守此约定。 私有(static)函数不是必需的,但建议这样做。
欢迎光临 嵌入式开发交流网论坛 (http://www.dianzixuexi.com/bbs/) | Powered by Discuz! X3.2 |