浅谈C/C++指针和引用在Linux和Windows不同环境下的编码风格

news2024/11/24 3:54:51

目录

0. 前言

1. 代码块、函数体上的  {  }  的规范

2. 指针和引用中的 * 和 & 符号的位置

1. Linux 环境下编码风格(gcc)

2. Windows 环境下编码风格(Visual Studio)

3. 简单总结


0. 前言

C/C++因为高度的自由性,并没有对一些常见的编码风格进行限制,所以我们能看到各种各样不同的风格。举几个例子来看,比如一下两种常见的情况:

1. 代码块、函数体上的  {  }  的规范

// 常见写法中的第一种写法:
void func()
{
    // ...
}

// 常见写法中的第二种写法:
void func() {
    // ...
}

2. 指针和引用中的 * 和 & 符号的位置

这里详细的写法我们下面再看。


对于 第一种 代码块、函数体上的  {  }  的规范呢,Golang语言中强制规定了风格为上述常见写法中的第二种写法。Python语言中呢直接取消了 { }  ,直接使用缩进来控制。

我认为这样在语法层面上直接控制代码风格是一种解决出现各种各样不同代码风格的代码的很好的一种方式,是大大提高了代码的可读性,也降低了团队协同开发的成本

所以,在C/C++中,我想直接引用 林锐博士 的《高质量C++/C编程指南》之中的风格,就不做过多的讨论了~!

对于林锐博士的这样C/C++代码风格呢,我个人还是十分喜欢的~~(当然没有不喜欢Golang风格的意思,哈哈~)

这篇文章呢,我希望主要来谈论 “指针和引用中的 * 和 & 符号的位置” 这个问题~!


这一部分,我们接着讨论 “指针和引用中的 * 和 & 符号的位置” 的问题!

1. Linux 环境下编码风格(gcc)

我们直接先看代码,通过代码来看这一种代码风格~

// 指针的风格
int *func(void)
{
    int *ptr = (int *)malloc(sizeof(int));

    int* *pptr = &ptr;
    
    return ptr;
}

// 引用的风格
int main()
{
    int a = 10;
    int &b = a;

    return 0;
}

在Linux 环境下,我们喜欢将这颗 * 的位置更靠近变量ptr,来表示这个变量是一个指针变量,指向的变量的类型是前面类型 int。

对于二级指针呢,依然是后面的那颗 * 的位置,靠近变量pptr,来表示这个变量是一个指针变量,指向的变量的类型是前面的类型 int*。

引用变量也是同样的道理,我们将 & 符号 放在靠经变量的位置,来表示这个变量是一个引用变量。

2. Windows 环境下编码风格(Visual Studio)

// 指针的风格
int* func(void)
{
    int* ptr = (int*)malloc(sizeof(int));

    int** pptr = &ptr;

    return ptr;
}

// 引用的风格
int main()
{
    int a = 10;
    int& b = a;
    return 0;
}

在Windows环境下,我们喜欢将这个 * 的位置放在靠近类型的位置,来表明这个变量的类型是int*,而在变量类型是有*,那么说明这个变量是指针变量,指向的类型就是 * 前面的类型。

对于二级指针,依然是将这个 * 的位置放在靠近类型的位置,来表明这个变量的类型是int**,有两颗星说明这是一个二级指针变量,指向的类型就是第二颗 * 前面的类型。

对于引用来说呢,也是也指针一样的道理, & 符号的位置更靠近类型,来表用这个变量的类型是int&。

3. 简单总结

指针和引用的书写风格,属于是“仁者见仁,智者见智”,但是我的认为是Linux环境下的风格比较漂亮,易于理解。因为我认为,对于指针变量来说,我们的逻辑应该是先知道它是一个指针,再看它指向什么类型的变量。我看来这样更加的容易理解。

这里呢除了上面说过的 林锐博士 的《高质量C++/C编程指南》呢,再推荐一些比较权威的C/C++的规范供大家参考!

谷歌的C/C++代码规范

C++ 风格指南 - 内容目录 — Google 开源项目风格指南

360C/C++代码规范

https://github.com/Qihoo360/safe-rules

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

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

相关文章

https://registry.nlark.com/无法访问

先上问题: own up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. npm ERR! code ENOTFOUND npm ERR! syscall getaddrinfo npm ERR! errno ENOTFOU…

电动自行车出海黑马Avento独立站拆解(上)丨出海笔记

这次我们来拆解一个电动自行车的独立站 为什么选电动自行车? 因为全球疫情,带来出行问题——避免聚集,大家都减少了公共交通工具,而改为自行车,电动自行车...... 君不见疫情之后无论是出行自行车,还是健…

NMAP扫描器的使用

NMAP 一 概述 nmap是一个网络探测和安全扫描工具,系统管理者和个人可以使用这个软件扫描大型的网络,获取 哪台主机正在运行以及提供什么服务等信息。 nmap可用于 检测活在网络上的主机(主机发现)。 检测主机上开放的端口(端口发现)。 检测到相应的端口(服务发现…

cisp-pte考试复盘

考试客户端下载-->点击进入考试>输入密码->进去可以看见一个qax的登录框【监考员会告知账户密码】->进入考试页面 里面的操作题,点击开始答题,能看见一个题有一个攻击机,这时我们需要点击鼠标左键,看见一个控制台,点击控制台才能进入答题【双击是没有用的】 …

C/C++开发,opencv内置背景减除算法与运动检测

目录 一、c opencv 背景减除算法内置算法 1.1 MOG2算法 1.2 KNN算法 二、完整案例实现 2.1 程序代码 2.2 程序编译及输出 一、c opencv 背景减除算法内置算法 背景减除算法的目标是将视频帧中的背景与前景(通常是移动的对象)分离。OpenCV提供MOG2&…

数据结构-排序的概念、应用及其算法实现1(直接插入排序、希尔排序、选择排序、堆排序、冒泡排序)

本篇文章主要讲解直接插入排序、希尔排序、选择排序、堆排序、冒泡排序算法实现以及时间复杂度,稳定性分析。将在接下来的文章讲解快速排序、归并排序和计数排序。 本文全部代码在文章最后 目录 一、常见的排序算法 a.排序实现的接口 1.1插入排序 1.1.1基本思想…

【C++】BFS解决边权唯一的最短路径问题

目录 介绍 迷宫中离入口最近的出口 算法思路 代码实现 最小基因变化 算法思路 代码实现 单词接龙 算法思路 代码实现 为高尔夫比赛砍树 算法思路 代码实现 介绍 最短路问题是图论中非常经典的一种问题,其实就是通过代码找到两点之间的最优路径(往往是距离最短),最…

用MobaXterm,TightVNC和secure SSH实现两台windows电脑之间的连接和通信

今天给大家分享一个非常有趣的技术,那便是如何使用MobaXterm来实现两台电脑之间的通信。实验成功,保证能跑。 首先,给大家介绍我们今天最重要的工具:那便是MobaXterm(以下由ChatGPT生成): Moba…

C++初阶_2: inline内联函数 宏函数

C推出了inline关键字,其目的是为了替代C语言中的宏函数。 我们先来回顾宏函数: 宏函数 现有个需求:要求你写一个Add(x,y)的宏函数。 正确的写法有一种,错误的写法倒是五花八门,我们先来“见不贤而自省也。” // …

我怎么会这么依赖 GUI?

AWS CLI、.NET 和 Lambda 函数 欢迎来到雲闪世界。在 Windows 上使用 Visual Studio 和 AWS Explorer 绝对会让你变得懒惰。我的意思是,能够通过右键单击项目来构建和部署 Lambda 函数之类的东西真是太棒了,但有时最好了解幕后发生了什么。 尽管如此&am…

Java - 异常

异常处理: ①捕获异常 选中代码后ctrlAltt: try catch捕捉异常 ②抛出异常 加上throws 异常类型 自定义异常 Exception.java: package Exception;//自定义运行时异常 public class ExceptionTest {public static void main(String[] args) {//保存一个合法的年…

知识库管理软件购买指南:2024年十大选择

本篇文章介绍了以下工具:PingCode、Worktile、蓝湖、语雀、幕布、Guru、Helpjuice、Stack Overflow for Teams、KnowledgeOwl、eXo Platform。 在企业中,信息分散、难以获取是个常见的痛点。无论是新员工入职、团队协作,还是项目管理&#xf…

电脑高手必备!这款数据恢复神器你值得拥有

哎呀,现在我们天天在用的手机、电脑和各种移动设备都是有很多日常和工作中的重要数据,丢失重要的文件和数据的时候就很着急,所以我也很感同身受,为此困扰过我好几次,所以今天特地借此文章整理了常用的失易得数据恢复软…

Unity游戏开发002

Unity游戏开发002 目录 第一章:Hello,Unity!第二章:创建一个游戏体 本文目录 Unity游戏开发 Unity游戏开发002目录本文目录前言一、创建一个游戏体1. 编辑器语言设置2. 创建游戏对象的两种方法3. 快速复制和粘贴物体4. 注意事项…

/springmvc/xxx.html和/springmvc/xxx的区别

起因: 今天在访问webapp目录下的html文件时,突然报了500错误(如下图),让我检查视图解析器,我寻思我访问的是静态资源,不是直接交给servlet处理嘛?需要什么视图解析器?&a…

13.C基础_预处理

预处理语句就是以#开头的语句。这些语句类型如下: #include:包含头文件#define:宏定义#undef:取消宏定义#ifdef,#endif:成对使用,判断是否定义了某个宏 宏定义 宏定义的本质就是原样替换&…

【Material-UI】Floating Action Button (FAB) 详解:动画效果 (Animation)

文章目录 一、FAB 按钮的动画概述1. 默认动画效果2. 多屏幕横向切换时的动画 二、FAB 动画效果的实现1. 代码示例:跨标签页的 FAB 动画2. 代码解析3. 多个 FAB 的切换 三、动画效果的最佳实践四、总结 在现代网页设计中,动画不仅提升了用户界面的动态感&…

React+AntDesign做一个日历,展示节假日,节气,并且在某几个时间上添加活动备注

直接贴效果图😄 首先日历是用的AntDesign提供的Calendar组件,这个组件还是蛮强大的,可以自定义头部时间下拉;渲染每个时间段,或者重置时间段内容,玩的空间是很大的 直接贴代码,结尾最后我会将开发中遇到的问题贴出来解答一下 第一步:下载js-calendar-converter添加…

SpringBoot集成日志框架

SpringBoot集成日志框架 Java生态体系日志框架介绍 简介 在Java生态体系中,围绕着日志,有很多成熟的解决方案。关于日志输出,主要有两类工具。 一类是日志框架(Log4j、Logback),主要用来进行日志的输出的…

Unity 使用 NewtonSoft Json插件报错

JsonReaderException: Unexpected character encountered while parsing value: . Path , line 0, position 0. 通过断点发现,头有一串ZWNBSP,这个是BOM格式的JSON。在文件下看不到。 解决方法:改编码格式,Remove BOM.