前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【C语言】C 语言编码风格(基于 ISO/IEC 9899:2024 和 Linux 内核编码风格 v6.13.0-rc4)

【C语言】C 语言编码风格(基于 ISO/IEC 9899:2024 和 Linux 内核编码风格 v6.13.0-rc4)

作者头像
LuckiBit
发布2024-12-27 08:19:01
发布2024-12-27 08:19:01
25600
代码可运行
举报
文章被收录于专栏:C语言
运行总次数:0
代码可运行
LuckiBit
LuckiBit

C 语言的编码风格对于编写清晰、可维护、易于调试的代码至关重要。本文将结合 ISO/IEC 9899:2024 (N3220) 标准(即 C23 标准)和 Linux 内核编码风格 v6.13.0-rc4,全面讲解 C 语言编码规范。这两个文献代表了行业中的两个重要编码风格,本文将结合它们的规则和最佳实践进行对比分析,并提供代码示例。

1. 缩进与空格

1.1 缩进

编码风格

规则

C23 标准

推荐使用 4 个空格,但可根据团队约定进行调整。

Linux 内核风格

Tab(制表符) 缩进,每一级缩进为 8 个字符。

规范出自

  • ISO/IEC 9899:2024 (N3220):第 6.5.2 节,第 9 行。
  • Linux内核文档:第 2 节,第 14 行。

示例:

Linux 内核风格

代码语言:javascript
代码运行次数:0
复制
if (condition) {
        do_something();
} else {
        do_something_else();
}

C23 标准(建议)

代码语言:javascript
代码运行次数:0
复制
if (condition) {
    do_something();
} else {
    do_something_else();
}
1.2 空格的使用

编码风格

规则

C23 标准

二元运算符(如 +、-、== 等)两边应加空格。

Linux 内核风格

与 C23 标准相同,但特别注意 sizeof、alignof 等关键字后不加空格。

规范出自

  • ISO/IEC 9899:2024 (N3220):第 6.5.8 节,第 2 行。
  • Linux内核文档:第 2 节,第 16 行。

示例:

Linux 内核风格

代码语言:javascript
代码运行次数:0
复制
s = sizeof(struct file);  // sizeof 后不加空格
a = b + c;                 // 运算符两侧加空格

C23 标准(建议)

代码语言:javascript
代码运行次数:0
复制
s = sizeof(struct file);  // sizeof 后不加空格
a = b + c;                 // 运算符两侧加空格

2. 行长

编码风格

规则

C23 标准

建议每行不超过 100 个字符。但 79 个字符 更为常见。

Linux 内核风格

严格要求每行 不超过 80 个字符。

规范出自

  • ISO/IEC 9899:2024 (N3220):第 6.1 节,第 12 行。
  • Linux内核文档:第 2 节,第 19 行。

示例:

Linux 内核风格

代码语言:javascript
代码运行次数:0
复制
printf("This is a long line, which should be broken into two lines "
       "to avoid exceeding the 80-character limit.");

C23 标准(建议)

代码语言:javascript
代码运行次数:0
复制
printf("This is a long line, which should be broken into two lines "
       "to avoid exceeding the 100-character limit.");

3. 变量与命名

3.1 变量命名

编码风格

规则

C23 标准

推荐使用 小写字母 和 下划线(snake_case)。

Linux 内核风格

使用 小写字母 和 下划线,并确保命名简洁描述性。

规范出自

  • ISO/IEC 9899:2024 (N3220):第 6.3.1 节,第 5 行。
  • Linux内核文档:第 3 节,第 8 行。

示例:

Linux 内核风格

代码语言:javascript
代码运行次数:0
复制
int max_buffer_size;

C23 标准(建议)

代码语言:javascript
代码运行次数:0
复制
int max_buffer_size;
3.2 宏命名

编码风格

规则

C23 标准

宏名应使用 大写字母 和 下划线(UPPER_SNAKE_CASE)。

Linux 内核风格

宏名应使用 全大写字母 和 下划线。

规范出自

  • ISO/IEC 9899:2024 (N3220):第 6.3.1 节,第 9 行。
  • Linux内核文档:第 5 节,第 4 行。

示例:

Linux 内核风格

代码语言:javascript
代码运行次数:0
复制
#define MAX_BUFFER_SIZE 1024

C23 标准(建议)

代码语言:javascript
代码运行次数:0
复制
#define MAX_BUFFER_SIZE 1024

4. 数据结构

4.1 结构体定义

编码风格

规则

C23 标准

结构体成员按顺序列出,类型对齐。

Linux 内核风格

结构体成员应按内存对齐要求排列。

规范出自

  • ISO/IEC 9899:2024 (N3220):第 6.5.6 节,第 6 行。
  • Linux内核文档:第 3 节,第 8 行。

示例:

Linux 内核风格

代码语言:javascript
代码运行次数:0
复制
struct file {
    struct inode *inode;
    unsigned long f_flags;
    char *f_path;
};

C23 标准(建议)

代码语言:javascript
代码运行次数:0
复制
struct file {
    struct inode *inode;
    unsigned long f_flags;
    char *f_path;
};
4.2 枚举定义

编码风格

规则

C23 标准

枚举成员应使用 大写字母,单词间使用下划线。

Linux 内核风格

枚举成员应使用 大写字母,单词间使用下划线。

规范出自

  • ISO/IEC 9899:2024 (N3220):第 6.4.4 节,第 8 行。
  • Linux内核文档:第 4 节,第 4 行。

示例:

Linux 内核风格

代码语言:javascript
代码运行次数:0
复制
enum file_flags {
    O_RDONLY,
    O_WRONLY,
    O_RDWR
};

C23 标准(建议)

代码语言:javascript
代码运行次数:0
复制
enum file_flags {
    O_RDONLY,
    O_WRONLY,
    O_RDWR
};

5. 运算符与表达式

5.1 运算符使用

编码风格

规则

C23 标准

二元运算符两边加空格;一元运算符前后不加空格。

Linux 内核风格

同 C23 标准,但特别强调 sizeof、alignof 等关键字后不加空格。

规范出自

  • ISO/IEC 9899:2024 (N3220):第 6.5.8 节,第 2 行。
  • Linux内核文档:第 2 节,第 16 行。

示例:

Linux 内核风格

代码语言:javascript
代码运行次数:0
复制
s = sizeof(struct file);  // sizeof 后不加空格
a = b + c;                 // 运算符两侧加空格

C23 标准(建议)

代码语言:javascript
代码运行次数:0
复制
s = sizeof(struct file);  // sizeof 后不加空格
a = b + c;                 // 运算符两侧加空格

6. 注释

6.1 单行注释

编码风格

规则

C23 标准

单行注释使用 //,注释内容简洁清晰。

Linux 内核风格

单行注释使用 //,紧跟在代码后面。

规范出自

  • ISO/IEC 9899:2024 (N3220):第 6.1.3 节,第 10 行。
  • Linux内核文档:第 6 节,第 6 行。

示例:

Linux 内核风格

代码语言:javascript
代码运行次数:0
复制
int value = 10; // 设置初始值为10

C23 标准(建议)

代码语言:javascript
代码运行次数:0
复制
int value = 10; // 设置初始值为10
6.2 多行注释

编码风格

规则

C23 标准

使用 /* 和 */ 包裹多行注释,并尽量简洁明了。

Linux 内核风格

多行注释应避免过度嵌套,保持清晰简洁,使用 /* 和 */。

规范出自

  • ISO/IEC 9899:2024 (N3220):第 6.1.3 节,第 10 行。
  • Linux内核文档:第 6 节,第 7 行。

示例:

Linux 内核风格

代码语言:javascript
代码运行次数:0
复制
/*
 * 这是一个多行注释,描述代码的功能。
 * 这里继续说明该部分代码的作用。
 */

C23 标准(建议)

代码语言:javascript
代码运行次数:0
复制
/*
 * 这是一个多行注释,描述代码的功能。
 * 这里继续说明该部分代码的作用。
 */

7. 函数与流程控制

7.1 函数定义

编码风格

规则

C23 标准

函数定义时,返回类型和函数名之间应有一个空格。参数列表应紧跟在函数名之后,若参数超过一行,应缩进。

Linux 内核风格

同 C23 标准,且建议函数名前加下划线以表示其为内核私有函数(如果适用)。

规范出自

  • ISO/IEC 9899:2024 (N3220):第 6.9.1 节,第 4 行。
  • Linux内核文档:第 7 节,第 5 行。

示例:

Linux 内核风格

代码语言:javascript
代码运行次数:0
复制
static int my_function(int a, int b)
{
    return a + b;
}

C23 标准(建议)

代码语言:javascript
代码运行次数:0
复制
int add(int a, int b)
{
    return a + b;
}
7.2 流程控制语句(if/else)

编码风格

规则

C23 标准

if、else 等语句的花括号({})应始终使用,即使代码块仅包含一条语句。

Linux 内核风格

与 C23 标准相同,要求花括号 {} 即使只有一条语句也要写上。

规范出自

  • ISO/IEC 9899:2024 (N3220):第 6.8.4 节,第 4 行。
  • Linux内核文档:第 8 节,第 9 行。

示例:

Linux 内核风格

代码语言:javascript
代码运行次数:0
复制
if (condition) {
    do_something();
} else {
    do_something_else();
}

C23 标准(建议)

代码语言:javascript
代码运行次数:0
复制
if (condition) {
    do_something();
} else {
    do_something_else();
}

8. 错误处理与返回值

8.1 错误处理

编码风格

规则

C23 标准

错误处理应尽量使用标准库函数,如 perror()、strerror(),并适当返回错误码。

Linux 内核风格

使用 pr_err() 等内核函数输出错误信息,并使用适当的错误码(如 -EINVAL)。

规范出自

  • ISO/IEC 9899:2024 (N3220):第 7.19 节,第 2 行。
  • Linux内核文档:第 9 节,第 4 行。

示例:

Linux 内核风格

代码语言:javascript
代码运行次数:0
复制
if (error_condition) {
    pr_err("Error occurred: %d\n", error_code);
    return -EINVAL;
}

C23 标准(建议)

代码语言:javascript
代码运行次数:0
复制
if (error_condition) {
    perror("Error occurred");
    return -1;
}

9. 内存管理

9.1 动态内存分配

编码风格

规则

C23 标准

使用 malloc() 和 free() 进行内存分配和释放,确保分配成功后处理错误。

Linux 内核风格

使用内核专用的 kmalloc() 和 kfree() 进行内存管理。

规范出自

  • ISO/IEC 9899:2024 (N3220):第 7.10 节,第 5 行。
  • Linux内核文档:第 10 节,第 2 行。

示例:

Linux 内核风格

代码语言:javascript
代码运行次数:0
复制
int *ptr = kmalloc(sizeof(int) * 10, GFP_KERNEL);
if (!ptr) {
    pr_err("Memory allocation failed\n");
    return -ENOMEM;
}
kfree(ptr);

C23 标准(建议)

代码语言:javascript
代码运行次数:0
复制
int *ptr = malloc(sizeof(int) * 10);
if (ptr == NULL) {
    perror("Memory allocation failed");
    return -1;
}
free(ptr);

10. 总结

C 语言的编码风格标准在许多方面有相似之处,特别是在变量命名、函数定义、注释和代码结构方面。ISO/IEC 9899:2024 (N3220)(即 C23 标准)提供了一些通用的编码建议,而 Linux 内核编码风格 则更多关注内核代码的性能和可维护性。

  • 缩进和空格:Linux 内核风格使用制表符进行缩进,而 C23 标准推荐使用空格,通常为 4 个空格。
  • 行长:C23 标准建议每行不超过 100 个字符,Linux 内核风格则要求 80 个字符以内。
  • 命名约定:两者都推荐使用小写字母和下划线(snake_case)来命名变量和函数。
  • 注释:对于单行和多行注释,两者都使用 ///* */,强调简洁明了。

这些规范可以帮助开发者编写更整洁、易于阅读和维护的 C 语言代码,特别是在多团队协作的项目中。

11. 参考文献:

  1. ISO/IEC 9899:2024 (N3220) — C23标准文档的最新版本:
  2. Linux内核编码风格 v6.13.0-rc4

12. 结束语

  1. 本节内容已经全部介绍完毕,希望通过这篇文章,大家对C语言的编码风格有了更深入的理解和认识。
  2. 感谢各位的阅读和支持,如果觉得这篇文章对你有帮助,请不要吝惜你的点赞和评论,这对我们非常重要。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 缩进与空格
    • 1.1 缩进
    • 1.2 空格的使用
  • 2. 行长
  • 3. 变量与命名
    • 3.1 变量命名
    • 3.2 宏命名
  • 4. 数据结构
    • 4.1 结构体定义
    • 4.2 枚举定义
  • 5. 运算符与表达式
    • 5.1 运算符使用
  • 6. 注释
    • 6.1 单行注释
    • 6.2 多行注释
  • 7. 函数与流程控制
    • 7.1 函数定义
    • 7.2 流程控制语句(if/else)
  • 8. 错误处理与返回值
    • 8.1 错误处理
  • 9. 内存管理
    • 9.1 动态内存分配
  • 10. 总结
  • 11. 参考文献:
  • 12. 结束语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档