代码规范整理
断言使用
#ifndef DEBUG_MODE
#define assert(expression) ((void)0)
#endif
swicth 编写规范
#define UNREACHABLE() assert(0)
enum Day {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
};
void printDayName(enum Day day) {
switch (day) {
case MONDAY: {
printf("Monday\n");
break;
}
case TUESDAY: {
printf("Tuesday\n");
break;
}
case WEDNESDAY: {
printf("Wednesday\n");
break;
}
case THURSDAY: {
printf("Thursday\n");
break;
}
case FRIDAY: {
printf("Friday\n");
break;
}
case SATURDAY: {
printf("Saturday\n");
break;
}
case SUNDAY: {
printf("Sunday\n");
break;
}
default: {
printf("Invalid day\n");
// UNREACHABLE();
}
}
}
- 每个
case
语句块使用花括号包裹代码块。 - 每个
case
块都以break
语句终止,确保不会出现fall-through
。 default
语句块包含一个注释,说明这种情况是无效的。- 可以使用
UNREACHABLE()
宏来表示default
语句块是不可达的(注释掉了)。
min 和 max 宏的使用
define MIN(a, b) (((a) < (b)) ? (a) : (b))
define MAX(a, b) (((a) > (b)) ? (a) : (b))
注意使用括号保证优先级
三元表达式
int max = (a > b) ? a : b;
for循环规范
Google 代码规范对于 for
循环的写法提供了以下建议:
- 使用范围式
for
循环(range-basedfor
loop)来遍历容器或序列,例如使用for (const auto& element : container)
的形式。
std::vector<int> numbers = {1, 2, 3, 4, 5};
for (const auto& number : numbers) {
// 使用 number 进行操作
}
- 如果需要使用索引进行迭代,可以使用传统的
for
循环,并使用size_t
类型的索引变量。
std::vector<int> numbers = {1, 2, 3, 4, 5};
for (size_t i = 0; i < numbers.size(); ++i) {
// 使用 numbers[i] 进行操作
}
- 对于不需要使用循环变量的情况,可以使用
_
作为循环变量名。
std::vector<int> numbers = {1, 2, 3, 4, 5};
for (const auto& _ : numbers) {
// 不使用循环变量
// 可以使用 _ 进行占位,表示循环变量不被使用
}
函数注释
Google 的代码规范非常强调代码的可读性和一致性。对于函数注释,Google 提供了一套详细的指南,特别是在其开源项目样式指南中。以下是根据 Google C++ 风格指南中的建议,编写函数注释的一个示例:
/**
* Brief description which ends at this dot.
*
* Longer description which may extend over multiple lines. This starts with a
* brief description which may be just one sentence or a couple of sentences.
* Then there can be additional paragraphs if needed. They should be separated
* by blank lines.
*
* @param[in] param1 Description of the first parameter.
* @param[out] param2 Description of the second parameter which is passed by reference and modified by the function.
* @param[in] param3 (Optional) Description of the third parameter which has a default value.
* @return Description of the return value.
* @throws Description of any exceptions that can be thrown.
*/
ReturnType FunctionName(Type param1, Type& param2, Type param3 = DefaultValue);
在这个例子中,注释包括以下部分:
- 简短描述:在第一行简洁地描述函数的作用,以一个句号结尾。
- 详细描述:如果需要,可以提供更详尽的描述,可能包括函数的行为、特殊的算法细节、使用注意事项等。
- 参数:使用
@param
标签来描述每个参数。[in]
表示输入参数,[out]
表示输出参数。如果参数是可选的,应该明确指出并描述默认值。 - 返回值:使用
@return
标签来描述函数返回值的类型和意义。 - 异常:使用
@throws
或@exception
标签来描述函数可能抛出的异常类型和原因。
请注意,不同的编程语言可能有不同的注释风格,Google 为 Python、Java、JavaScript 等语言也提供了风格指南。在实际编写代码时,应该参考使用的编程语言和项目中采用的具体风格指南。
注释常用标签
在代码注释中,尤其是在使用Doxygen、Javadoc、Sphinx等文档生成工具时,开发者会使用特定的标签(或称为注解)来提供结构化的信息。这些标签通常以@
或#
开始,它们帮助工具生成格式化的文档,标识参数、返回值、异常等。以下是一些常用的标签:
@param
或@arg
:描述一个函数的参数。@return
或@returns
:描述函数的返回值。@throws
或@exception
:描述函数可能抛出的异常。@see
:提供与当前代码相关的其他代码或文档的引用。@todo
:标记代码中待完成的任务。@deprecated
:标记不再推荐使用的代码元素。@brief
:提供一个简短的摘要或描述。@details
:提供关于代码的详细信息。@author
:标记代码的原始作者。@date
:标记代码编写或修改的日期。@version
:标记代码的版本。@since
:指示何时添加了特定的功能。@note
:提供重要的注释。@warning
:提醒用户注意代码中的潜在问题。@file
:在文件级注释中描述整个文件的作用。
if else if 编写规范
Google 的代码规范对于 if
、else if
、else
语句的编写有明确的格式要求,这些要求旨在保持代码的清晰性和一致性。以下是根据 Google C++ 风格指南提供的 if
、else if
、else
语句的格式示例:
if (condition) {
// Do something when condition is true.
} else if (another_condition) {
// Do something else if another condition is true.
} else {
// Do something when none of the above conditions are true.
}
注意以下几点:
if
后面的条件表达式两边不加空格。- 条件表达式后的左大括号
{
与if
或else
在同一行。 else if
和else
关键字在新的一行,并与前面的关闭大括号}
对齐。- 每个代码块(即每个条件下的执行语句)都被大括号
{}
包围,即使它只有一条语句。 - 代码块的内容缩进一级(通常是两个空格)。
Google 风格指南还推荐在可能的情况下,使用条件运算符(?:
)来替代简单的 if-else
语句,以提高代码的简洁性。但是,如果 if-else
语句过于复杂或条件运算符会使代码难以阅读,应该避免使用条件运算符。