代码规范整理

断言使用

#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();
    }
  }
}
  1. 每个case语句块使用花括号包裹代码块。
  2. 每个case块都以break语句终止,确保不会出现fall-through
  3. default语句块包含一个注释,说明这种情况是无效的。
  4. 可以使用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 循环的写法提供了以下建议:

  1. 使用范围式 for 循环(range-based for loop)来遍历容器或序列,例如使用 for (const auto& element : container) 的形式。
std::vector<int> numbers = {1, 2, 3, 4, 5};
for (const auto& number : numbers) {
    // 使用 number 进行操作
}
  1. 如果需要使用索引进行迭代,可以使用传统的 for 循环,并使用 size_t 类型的索引变量。
std::vector<int> numbers = {1, 2, 3, 4, 5};
for (size_t i = 0; i < numbers.size(); ++i) {
    // 使用 numbers[i] 进行操作
}
  1. 对于不需要使用循环变量的情况,可以使用 _ 作为循环变量名。
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等文档生成工具时,开发者会使用特定的标签(或称为注解)来提供结构化的信息。这些标签通常以@#开始,它们帮助工具生成格式化的文档,标识参数、返回值、异常等。以下是一些常用的标签:

  1. @param@arg:描述一个函数的参数。
  2. @return@returns:描述函数的返回值。
  3. @throws@exception:描述函数可能抛出的异常。
  4. @see:提供与当前代码相关的其他代码或文档的引用。
  5. @todo:标记代码中待完成的任务。
  6. @deprecated:标记不再推荐使用的代码元素。
  7. @brief:提供一个简短的摘要或描述。
  8. @details:提供关于代码的详细信息。
  9. @author:标记代码的原始作者。
  10. @date:标记代码编写或修改的日期。
  11. @version:标记代码的版本。
  12. @since:指示何时添加了特定的功能。
  13. @note:提供重要的注释。
  14. @warning:提醒用户注意代码中的潜在问题。
  15. @file:在文件级注释中描述整个文件的作用。

if else if 编写规范

Google 的代码规范对于 ifelse ifelse 语句的编写有明确的格式要求,这些要求旨在保持代码的清晰性和一致性。以下是根据 Google C++ 风格指南提供的 ifelse ifelse 语句的格式示例:

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 后面的条件表达式两边不加空格。
  • 条件表达式后的左大括号 {ifelse 在同一行。
  • else ifelse 关键字在新的一行,并与前面的关闭大括号 } 对齐。
  • 每个代码块(即每个条件下的执行语句)都被大括号 {} 包围,即使它只有一条语句。
  • 代码块的内容缩进一级(通常是两个空格)。

Google 风格指南还推荐在可能的情况下,使用条件运算符(?:)来替代简单的 if-else 语句,以提高代码的简洁性。但是,如果 if-else 语句过于复杂或条件运算符会使代码难以阅读,应该避免使用条件运算符。

posted @ 2023-12-29 19:28  lhclqslove  阅读(4)  评论(0编辑  收藏  举报