【C++】编程规范之函数规则

  1. 对所有函数入参进行合法性检查
    在编写函数时,应该始终对所有传入的参数进行合法性检查,以防止出现意外的错误或异常情况。这包括但不限于检查指针是否为空、整数是否在有效范围内、数组是否越界等等。通过对参数进行严格的合法性检查,可以避免许多潜在的错误。
#include <iostream>void divide(int dividend, int divisor) {if (divisor == 0) {std::cerr << "Error: divisor cannot be zero!" << std::endl;return;}int result = dividend / divisor;std::cout << "Result of division: " << result << std::endl;
}int main() {divide(10, 2);    // 正常调用divide(10, 0);    // 非法调用,除数为0return 0;
}
  1. 函数内部静态数组大小不超过1KB
    在函数内部使用静态数组时,应该确保数组的大小不超过1KB。这是为了避免在Android线程栈空间(通常小于1MB)中消耗过多的内存资源,从而导致栈溢出或者影响其他线程的正常运行。
#include <iostream>void processArray() {static int arr[256];  // 256 * sizeof(int) = 1024 bytes// 对数组进行处理...std::cout << "Array processed successfully!" << std::endl;
}int main() {processArray();return 0;
}
  1. 函数不可返回指向栈内存的指针或引用
    在函数中返回指向栈内存的指针或引用是一种常见的错误做法,因为栈内存的生命周期与函数调用的生命周期相关联,一旦函数返回后,栈内存将被释放,导致指针或引用失效。为了避免这种情况,应该始终避免返回指向栈内存的指针或引用。
#include <iostream>int* createArray() {int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};return arr;  // 错误:返回指向栈内存的指针
}int main() {int* ptr = createArray();std::cout << "Value at index 0: " << ptr[0] << std::endl; // 未定义行为return 0;
}
  1. 只读的指针形参需加const前缀
    在函数的参数列表中,如果某个指针形参只用于读取数据而不修改数据,应该在指针类型前加上const关键字,以确保该指针不会意外地修改数据。这有助于提高代码的可读性和安全性,并减少意外的错误。
#include <iostream>void printArray(const int* arr, int size) {for (int i = 0; i < size; ++i) {std::cout << arr[i] << " ";}std::cout << std::endl;
}int main() {int arr[] = {1, 2, 3, 4, 5};printArray(arr, 5);return 0;
}
  1. 函数返回的错误码需要进行处理
    在函数中可能会出现各种错误情况,例如参数错误、内存分配失败、文件操作失败等等。为了有效地处理这些错误情况,应该在函数中返回错误码,并在调用函数的地方进行适当的错误处理。这可以提高程序的稳定性和可靠性。
#include <iostream>int divide(int dividend, int divisor) {if (divisor == 0) {return -1; // 返回错误码}return dividend / divisor;
}int main() {int result = divide(10, 0);if (result == -1) {std::cerr << "Error: divisor cannot be zero!" << std::endl;} else {std::cout << "Result of division: " << result << std::endl;}return 0;
}
  1. 线程安全
    在多线程环境中,函数的线程安全性尤为重要。为了确保函数的线程安全性,应该避免对全局变量和静态变量进行直接操作,而是使用线程安全的数据结构或加锁机制来保护共享数据的访问。通过采用适当的线程安全措施,可以避免多线程环境下的竞争条件和数据竞争,从而提高程序的并发性能和可靠性。
#include <iostream>
#include <mutex>std::mutex mtx; // 全局互斥锁void safeIncrement(int& num) {std::lock_guard<std::mutex> lock(mtx); // 使用互斥锁保护共享数据num++;
}int main() {int count = 0;const int THREAD_COUNT = 5;std::vector<std::thread> threads;for (int i = 0; i < THREAD_COUNT; ++i) {threads.push_back(std::thread(safeIncrement, std::ref(count)));}for (auto& thread : threads) {thread.join();}std::cout << "Final count value: " << count << std::endl;return 0;
}

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

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

相关文章

2024.2.19力扣每日一题——N叉树的后序遍历

2024.2.19 题目来源我的题解方法一 递归实现&#xff08;深度优先遍历&#xff09;方法二 迭代实现&#xff08;栈&#xff09; 题目来源 力扣每日一题&#xff1b;题序&#xff1a;590 我的题解 方法一 递归实现&#xff08;深度优先遍历&#xff09; 与二叉树的后序遍历的…

c++游戏 狼人杀(升级)

代码&#xff1a; #include <iostream>//C输入输出流库 #include <cstdlib>//使用srand函数要用到这个库 #include <ctime>//使用time函数要用到这个库 #include <Windows.h> #include <conio.h>long long sr0; using namespace std; void brc(…

Spring——依赖注入

开启DI服务(依赖注入) DI依赖注入的理解 依赖开发人员提供相关输入依赖Spring容器对象将相关数据赋到属性中 基于XML文件 通过set方法注入 property标签通过调用属性对应的set方法完成赋值属性赋值 基本类型赋值 value"xxx"引用类型赋值 ref "xxx" …

VScode-配置文件

导入配置文件 ShiftCtrlp 输入&#xff1a; import 选择文件 点击确认 导出配置文件 设置选择导出 确认导出 保存为本地文件 保存文件

黄金票据攻击

黄金票据攻击——域内横向移动技术 一、黄金票据攻击介绍&#xff1a; 黄金票据攻击是一种滥用Kerberos身份认证协议的攻击方式&#xff0c;它允许攻击者伪造域控krbtgt用户的TGT&#xff08;Ticket-Granting Ticket&#xff09;。通过这种方法&#xff0c;攻击者可以生成有效…

【原创】基于springboot+vue疫苗预约管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

element-ui tableData导出为xlsx文件

下载 npm i / yarn add file-saver、xlsx库 引入 import FileSaver from “file-saver”; import XLSX from “xlsx”; const simexport (data) > {// if (data.create_time && data.create_time.length > 0) {// data.start_time parseTime(data.create_tim…

Rust vs C++:2024,谁更懂错误处理?

讲动人的故事,写懂人的代码 「席双嘉,听说你的C++项目又因为忘了检查返回值导致内存泄漏,又加班了?」 周五中午,在国内某科技巨头熙熙攘攘的员工餐厅,贾克强半开玩笑地戳了戳坐在隔壁的席双嘉,眼神中满是戏谑。 贾克强,一个热衷于Rust的程序员,总是乐于挑战和探索新…

mfw-攻防世界

题目 点击about发现Git感觉是Git泄露 直接访问.git 本来用githack去扒源码但是成功了没文件一脸懵&#xff0c; 后面换一个工具githacker注意二个之间有区别 githack和githacker 然后去结果里查看文件 发现flag文件但是 没什么用 <?php // TODO // $FLAG ; ?> 然后…

算法设计和分析1( 算法问题求解基础)

chapter1 算法问题求解基础 1.1算法概述 1.什么是算法 算法—用计算机实现的问题求解方法。5个特征 &#xff08;1&#xff09;输入&#xff1a;0或多个 &#xff08;2&#xff09;输出&#xff1a;至少一个 &#xff08;3&#xff09;确定性&#xff1a;算法每一条指令都有…

QCC发射(TX SOURCE)USB发射A2DP音乐,实现MIC声音到主机

之前写过 CSR8670/8675 发射&#xff08;TX SOURCE&#xff09;USB发射A2DP音乐&#xff0c;实现MIC声音到主机的文章&#xff0c;目前把该方案移植到QCC方案&#xff08;QCC3040 QCC3056&#xff09;。 因 CSR8670/8675成本比较贵&#xff0c;现在移植到QCC平台。 由于众多游…

Pytorch for training1——read data/image

blog torch.utils.data.Dataset create dataset with class torch.utils.data.Dataset automaticly import torch from torch.utils.data import Datasetclass MyDataset(Dataset):def __init__(self, data):self.data datadef __getitem__(self, index):# 根据索引获取样本…

一句命令pip卸载所有已安装库

pip3 list --formatfreeze | grep -v ^\-e | grep -v pip | grep -v setuptools | cut -d -f 1 | xargs -n1 pip3 uninstall -y 这个命令的解释如下&#xff1a; pip list --formatfreeze&#xff1a;列出所有已安装的库及其版本号。grep -v ^\-e&#xff1a;排除那些以-e开…

华为OD面试手撕算法-合并排序数组

题目描述 本题是leetcode一道简单题&#xff1a;合并两个有序数组&#xff0c;但是对于时间和空间复杂度面试官明确给出了限制。 // 给定两个排序后的数组 A 和 B&#xff0c;其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法&#xff0c;将 B 合并入 A 并排序。 // 初始化…

maya移除节点 修改节点

目录 maya移除节点 使用 Maya 用户界面&#xff1a; 使用脚本&#xff1a; maya 修改节点名字 使用 Maya 用户界面&#xff1a; 使用 MEL 脚本&#xff1a; 使用 Python 脚本&#xff1a; 注意事项&#xff1a; maya移除节点 使用 Maya 用户界面&#xff1a; 在“层次…

Gin框架(3)

文件上传与下载 文件上传 单文件上传 单文件上传指的是一次只上传一个文件。在Gin中&#xff0c;可以使用c.SaveUploadedFile方法来保存单个上传的文件。 // SaveUploadedFile uploads the form file to specific dst. func (c *Context) SaveUploadedFile(file *multipart…

对 NGINX、Kong 和 Amazon 的 API 管理解决方案进行基准测试:它们能否交付实时 API?

原文作者&#xff1a;Alessandro Fael Garcia of F5 原文链接&#xff1a;对 NGINX、Kong 和 Amazon 的 API 管理解决方案进行基准测试&#xff1a;它们能否交付实时 API&#xff1f; 转载来源&#xff1a;NGINX 开源社区 NGINX 唯一中文官方社区 &#xff0c;尽在 nginx.org.c…

HAL STM32 硬件I2C方式读取AS5600磁编码器获取角度例程

HAL STM32 硬件I2C方式读取AS5600磁编码器获取角度例程 &#x1f4cd;相关篇《STM32 软件I2C方式读取AS5600磁编码器获取角度例程》 ✨stm32使用硬件I2C去读取角度数据&#xff0c;通过STM32CubeMX工具配置工程&#xff0c;读取角度数据&#xff0c;只需要调用一个函数&#xf…

常见的服务器技术

常见的服务器技术 1.虚拟化技术&#xff1a;虚拟化技术允许在一台物理服务器上创建多个虚拟服务器&#xff0c;每个虚拟服务器都可以独立运行不同的操作系统和应用程序。这大大提高了服务器的资源利用率&#xff0c;并提供了更好的灵活性、可扩展性和可靠性。 2.负载均衡技术&…

谷歌(Google)技术面试——在线评估问题(一)

谷歌&#xff08;Google&#xff09;面试过程的第一步&#xff0c;你可能会收到一个在线评估链接。 评估有效期为 7 天&#xff0c;包含两个编码问题&#xff0c;需要在一小时内完成。 以下是一些供你练习的在线评估问题。 在本章结尾处&#xff0c;还提供了有关 Google 面试不…