当前位置: 首页 > news >正文

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

目录

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.lryc.cn/news/420153.html

相关文章:

  • 【C#】一个项目移动了位置,或者换到其他电脑上,编译报错 Files 的值“IGEF,解决方法
  • 代码随想录算法训练营第五十八天|拓扑排序精讲 、dijkstra(朴素版)精讲
  • 【ARM】ULINK Pro如何和SWD接口进行连接调试
  • react框架安全设计
  • Kafka生产调优实践。Kafka消息安全性、消息丢失、消息积压、保证消息顺序性
  • DDColor部署安装,在服务器Ubuntu22.04系统——点动科技
  • 使用 SSL/TLS 加密保障 RocketMQ 的安全传输
  • uni-app开发
  • 2024社招面经_存储DB广告架构方向
  • android10 系统定制:增加应用锁功能
  • 数据结构----队列
  • 【python】实现对文件夹中的图像连续重命名方法
  • 【nginx 第一篇章】认识一下 NGINX 服务器
  • 【物联网】(防水篇)哪些电子产品需要通过 IPX7 防水级别测试?
  • 高级java每日一道面试题-2024年8月09日-网络篇-什么是XSS攻击如何避免?
  • Linux时间管理:命令与脚本的完美结合
  • 基于ssm+vue+uniapp的微信外卖小程序
  • lvs(linux virtual server)实例
  • Unity游戏开发
  • 5. MQTT消息类型详解(三)
  • TypeScript JSX
  • java里的序列化反序列化、HttpMessageConverter、Jackson、消息转化器、对象转化器...都是啥?
  • GNU/Linux - memtool使用
  • Qt5.12.8源码交叉编译带openssl版本
  • 串行并行数据转换
  • 推荐一个优秀的 .NET MAUI 组件库
  • 用Manim创建条形图【BarChart】
  • iMES工厂管家:强大的工厂管理系统
  • iOS ------ 事件响应链
  • Go 语言 switch 语句的特点