全面解读curl团队的C语言代码规范

代码风格统一有助于团队协作与代码review,业界用的比较多的是google的风格,本节来点不一样的,看看咱们平时用的比较多的工具curl团队的代码规范是什么样子的。

curl简单说一下,它在命令行或脚本中传输数据非常有用,大家也肯定用过,其源码实现可以在github上查看

https://github.com/curl/curl

45328e21e618bd56f82f0d5f78d47fe8.jpeg

下面我们来从几个方面看看curl的C语言开发规范。

  • 命名

  • 缩进

  • 注释

  • 长行

  • 大括号

  • 'else' 在下一行

  • 括号前不加空格

  • 使用布尔条件

  • 条件中不要赋值

  • 新块在新行上

  • 运算符周围加空格

  • 返回值不加括号

  • sizeof 参数加括号

  • 列对齐

  • 平台相关代码

  • 不要 typedef 结构体

命名

新的函数和变量名称应该是逻辑的、可理解的,并且根据它们的用途进行命名。

文件局部函数应该被声明为静态的,建议是小写字母名称。

缩进

只使用空格进行缩进,不使用制表符。每个新的开放大括号使用两个空格。

if(something_is_true) {while(second_statement == fine) {moo();}
}

注释

由于编写的是 C89 代码,不允许使用 // 注释。它们直到 C99 标准才被引入。只使用 **/* 注释 */**。

/* 这是一个注释 */

长行

curl 中的源代码永远不应该超过 79 列,即使在现代大屏幕和高分辨率屏幕时代,仍然有两个原因要保持这一点:

  1. 较窄的列比较宽的列更容易阅读。有一个原因是报纸几十年甚至几个世纪来一直使用列。

  2. 较窄的列允许开发人员更容易地在不同的窗口中并排显示多个代码片段。它允许在同一个屏幕上并排显示两个或三个源代码窗口 - 以及多个终端和调试窗口。

大括号

在 if/while/do/for 表达式中,我们将开放大括号写在与关键字同一行,然后将闭合大括号设置在与初始关键字相同缩进级别的同一行。就像这样:

if(age < 40) {/* 显然是年轻人 */
}

如果它们只包含一个一行语句,则可以省略大括号:

if(!x)continue;

对于函数,开放大括号应该写在单独的一行上:

int main(int argc, char **argv)
{return 1;
}

'else' 在下一行

在使用大括号添加 else 子句到条件表达式时,我们将其添加到关闭大括号后的新行。就像这样:

if(age < 40) {/* 显然是年轻人 */
}
else {/* 可能是脾气暴躁的 */
}

括号前不加空格

在使用 if/while/do/for 表达式时,关键字与开放括号之间不应有空格。就像这样:

while(1) {/* 永远循环 */
}

使用布尔条件

在 if/while 条件中,我们更喜欢测试条件值,如布尔值与 TRUE 或 FALSE、指针与 NULL 或 != NULL 以及整数与零或非零,而不是:

result = do_something();
if(!result) {/* 出现了问题 */return result;
}

条件中不要赋值

为了增加可读性并减少条件的复杂性,避免在 if/while 条件中进行变量赋值。不赞成这种风格:

if((ptr = malloc(100)) == NULL)return NULL;

而是鼓励更清晰地表达:

ptr = malloc(100);
if(!ptr)return NULL;

新块在新行上

永远不会在同一行上写多个语句,即使是短的 if() 条件也不例外。

if(a)return TRUE;
else if(b)return FALSE;

永远不要这样:

if(a) return TRUE;
else if(b) return FALSE;

运算符周围加空格

请在 C 表达式中运算符的两侧使用空格。后缀 (), [], ->, ., ++, -- 和一元 +, -, !, ~, & 操作符除外,它们不应该有空格。

示例:

bla = func();
who = name[0];
age += 1;
true = !false;
size += -2 + 3 *(a + b);
ptr->member = a++;
struct.field = b--;
ptr = &address;
contents = *pointer;
complement = ~bits;
empty = (!*string) ? TRUE : FALSE;

返回值不加括号

在 'return' 语句中不加额外的括号:

int works(void)
{return TRUE;
}

sizeof 参数加括号

在代码中使用 sizeof 运算符时,我们更喜欢在其参数周围加上括号:

int size = sizeof(int);

列对齐

一些语句不能在单行上完成,因为行太长、语句太难读,或者是由于上述其他风格指南。在这种情况下,语句跨越多行。

如果一个连续行是表达式或子表达式的一部分,那么你应该在适当的列上对齐,以便能够清楚地知道它是语句的哪一部分。运算符不应该起始于连续行。在其他情况下,遵循 2 个空格的缩进指南。以下是来自 libcurl 的一些示例:

if(Curl_pipeline_wanted(handle->multi, CURLPIPE_HTTP1) &&(handle->set.httpversion != CURL_HTTP_VERSION_1_0) &&(handle->set.httpreq == HTTPREQ_GET ||handle->set.httpreq == HTTPREQ_HEAD))/* 没有要求 HTTP/1.0 并且是 GET 或 HEAD 请求 */return TRUE;

如果没有括号,使用默认缩进:

data->set.http_disable_hostname_check_before_authentication =(0 != va_arg(param, long)) ? TRUE : FALSE;

函数调用时使用开放括号:

if(option) {result = parse_login_details(option, strlen(option),(userp ? &user : NULL),(passwdp ? &passwd : NULL),NULL);
}

与 "current open" 括号对齐:

DEBUGF(infof(data, "Curl_pp_readresp_ %d bytes of trailing ""server response left\n",(int)clipamount));

平台相关代码

使用 #ifdef HAVE_FEATURE 进行条件代码。我们避免在 #ifdef 行中检查特定操作系统或硬件。HAVE_FEATURE 应该由 configure 脚本为类 Unix 系统生成,并且它们在其他系统的 config-[system].h 文件中硬编码。

我们还鼓励在 libcurl 构建时,使用可能为空或定义为常量的宏/函数,以使代码无缝。就像这个例子,其中 magic() 函数根据构建时的条件不同而工作:

#ifdef HAVE_MAGIC
void magic(int a)
{return a + 2;
}
#else
#define magic(x) 1
#endifint content = magic(3);

不要 typedef 结构体

尽管可以使用结构体,但不要对其进行 typedef。使用 struct name 的方式来标识它们:

struct something {void *valid;size_t way_to_write;
};
struct something instance;

不要这样

typedef struct {void *wrong;size_t way_to_write;
} something;
something instance;

本文翻译自:https://curl.se/dev/code-style.html


热度更新,手把手实现工业级线程池

527deae18db09701e39bf4d174572ca2.jpeg

6192a8792d09e3035222ad94c4e47eb8.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/644231.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【规范】数据库字段命名与Java类属性对应

Java类中建议小驼峰methodId、数据库字段建议method_id mybatisPlus中进行字段映射是就是参照以上规范 当然若不参照规范&#xff0c;就要多很多繁琐注解 TableField(value "returnVal")

Microsoft SPY++ 使用教程及实操

Spy介绍 Spy (SPYXX.EXE) 是一个基于 Win32 的实用工具&#xff0c;提供系统进程、线程、窗口和窗口消息的图形视图。 Spy 有两个版本 第一个版本&#xff0c;名为 Spy (spyxx.exe)&#xff0c;用于显示发送到在 32 位进程中运行的窗口的消息。 例如&#xff0c;在 32 位进程…

【每日一题】2385. 感染二叉树需要的总时间-2024.4.24

题目&#xff1a; 2385. 感染二叉树需要的总时间 给你一棵二叉树的根节点 root &#xff0c;二叉树中节点的值 互不相同 。另给你一个整数 start 。在第 0 分钟&#xff0c;感染 将会从值为 start 的节点开始爆发。 每分钟&#xff0c;如果节点满足以下全部条件&#xff0c;…

基于springboot实现保密信息学科平台系统项目【项目源码+论文说明】

基于SpringBoot实现保信息学科平台系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于保密信息学科平台系统的开发全过程。通过分析基于保密信息学科平台系统管理的不足&#xff0c;创建了一个计算机…

C#带引导窗体的窗体设计方法:创建特殊窗体

目录 1.设计操作流程 2.实例 &#xff08;1&#xff09;Resources.Designer.cs &#xff08;2&#xff09;Frm_Main.Designer.cs &#xff08;3&#xff09;Frm_Main.cs &#xff08;4&#xff09;Frm_Start.Designer.cs &#xff08;5&#xff09;Frm_Start.cs &#…

【office安装错误1402或1406】

office安装错误1402或1406 错误如图 解决方法 打开autoremove&#xff0c;点击扩展&#xff0c;输入1402&#xff0c;点击搜索 等待修复成功&#xff0c;再尝试安装office 软件每周六选择其他登录方式可以免费使用

PHP之内置web服务器

1. 前言 PHP从5.4开始&#xff0c;就提供了一个内置的web服务器。 这个主要是用来做本地的开发测试用的&#xff0c;不能用于线上环境。 将PHP的安装路径配置到电脑的系统环境变量Path中&#xff0c;下图是win7&#xff0c;win10中会看的更清楚 2. 进入项目目录&#xff0c;执…

海康Visionmaster-常见问题排查方法-启动失数

问题2&#xff1a;VM无法启动&#xff0c;报错&#xff1a;参数错误&#xff1b;  问题原因&#xff1a;客户电脑环境异常导致代理启动失败。  解决方法&#xff1a;安装运行时库&#xff0c;并测试代理能否正常启动,步骤如下&#xff1a; ① 尝试双击代理进程&#xff…

ubuntu没有fcitx输入法图标

前言 Ubuntu20.04&#xff0c;卸载了ibus输入法&#xff0c;安装的fcitx搜狗输入法&#xff0c;出现无法切换到英文输入下&#xff0c;进行了重新启动&#xff0c;发现输入法图标不见了 可以尝试手动启动fcitx&#xff1a; 打开终端&#xff0c;运行以下命令&#xff1a; f…

Android Studio XML 预览View 底部移动到右边

以前 XML 的预览都是在右边的&#xff0c;最近不知道为什么突然到下面去了&#xff0c;很不习惯 找半天想把 预览view 移动到右边&#xff0c;一直没找到按钮。 误打误撞移回来了&#xff0c;原来只要再点击一次 split&#xff0c;就可以变动位置了&#xff0c;记录一下。

docker容器技术篇:集群管理实战mesos+zookeeper+marathon(二)

docker集群管理实战mesoszookeepermarathon&#xff08;二&#xff09; 一 实验环境 操作系统&#xff1a;centos7.9 二 基础环境配置以及安装mesos 安装过程请点击下面的链接查看&#xff1a; 容器集群管理实战mesoszookeepermarathon&#xff08;一&#xff09; 三 安装…

3个比较不错的Linux云音乐应用程序整理

在现代音乐流媒体时代&#xff0c;基于云的音乐应用程序因其便利性和可访问性而变得非常流行。Linux 用户尤其寻求可靠且功能丰富的音乐播放器来无缝地享受他们喜爱的音乐。 在这里&#xff0c;我们探讨了三个最好的基于云的音乐应用程序&#xff0c;每个应用程序都提供专为 L…