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

[转载] 以下划线开头的变量

  转自:https://blog.csdn.net/Grevi/article/details/60581354

  今天在公司看GNU ISO C++ Library库中的stl库时,偶然间感觉到一个问题,就是为什么很多系统库代码的变量名都以"_"下划线开头,然后就专门查了一下,这个帖子解释的还比较清楚,所以转了

  系统头文件里将宏名、变量名、内部函数名用"_"开头就是为了避免与用户用的名字冲突。因为当你include 系统头文件时,这些文件里的名字都有了定义,如果与你用的名字冲突,就可能引起各种奇怪现象。换句话说:我们写程序时一定不要用"_"开头的名字,以免与系统头文件的名字冲突,产生奇怪的问题(很难debug弄清楚,当心)。

Python

  核心风格:避免用下划线作为变量名的开始。因为下划线对解释器有特殊的意义,而且是内建标识符所使用的符号,我们建议程序员避免用下划线作为变量名的开始。一般来讲,变量名_xxx被看作是私有的,在模块或类外不可以使用。当变量是私有的时候,用_xxx 来表示变量是很好的习惯。因为变量名__xxx__对Python 来说有特殊含义,对于普通的变量应当避免这种命名风格。

   "单下划线开始的成员变量叫做保护变量,意思是只有类对象和自类对象自己能访问到这些变量;而 "双下划线开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。

以单下划线开头(_foo)的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用“from xxx import *”而导入;以双下划线开头的(__foo)代表类的私有成员;以双下划线开头和结尾的(__foo__)代表python里特殊方法专用的标识,如 __init__()代表类的构造函数。

 

C++:

  符合命名标准,只是有些使用习惯,比如在我们自己写的类中,为了避免和成员函数名称重复,我们通常在类的成员变量前加上下划线。(公司代码风格不太一样,类成员变量是以字母加下划线开头的)

 

  在我们自定义的类中,类的成员变量一般都加上前缀“_”,这样可以避免数据成员与成员函数的参数同名。这个是一般的命名规范,你可以采用也可以不采用 

好像华为有这种规范,比如做ACE方面编程,你看ACE的源代码就是了。 

  如果内部使用的话定义函数为protected或者private就是了,没必要用_开头。主要是看个人的编程习惯。库函数内部的东西,还要不要去弄。 

 

  另:最好不要轻易声明首字母为"_"的变量。就是说库函数内部实现用了这些函数,因为很多时候一个库函数功能的实现完全放在这一个函数里面可能不合适,或者某些库函数有共用的代码,怎么办的呢,就设计函数供库函数的实现调用。加下划线用意是避免命名重复。如果文档没有明确提及用法之类,最好不要用,以免实现改变了导致程序行为出现变化。 

  以前就有过微软的内部函数被破解,然后被人公布使用了,美其名曰技巧...后来微软想要改变函数,本来是自己内部用的,只要改操作系统代码就可以,结果发现后多程序运行不起来了,最后没办法只好保留这些函数,再去设计新的函数来实现想要的功能。所以最好不要依赖实现,不要依赖没有形成文档的东西

  自己定义的名字最好不要在前面加下划线,以免不小心和人家的函数重名

转载于:https://www.cnblogs.com/blog-yejy/p/9301504.html

相关文章:

  • Hibernate SQL优化小技巧使用dynamic-insert=true insert=true
  • mui页面传值
  • js中for循环的研究
  • HDU 3709 Balanced Number(数位DP)题解
  • 【笔记】最长递增子序列 Longest increasing subsequence(LIS)
  • c# 修改xml格式config文件
  • 【知识碎片】第三方登录弹窗效果
  • VMware虚拟机中为Linux 添加虚拟硬盘(VirtualBox方法类似)
  • Robot Framwork 问题小记
  • 给MySQL增加一个表示例
  • 复变函数:复函数的空间与Montel定理
  • sed使用命令记录
  • db2模式
  • 配置企业库5.0管理
  • SuperMicro(超微)IPMI安装操作系统KVM教程-超微3U8刀服务器
  • 时间复杂度分析经典问题——最大子序列和
  • 【剑指offer】让抽象问题具体化
  • 0基础学习移动端适配
  • Asm.js的简单介绍
  • es的写入过程
  • js ES6 求数组的交集,并集,还有差集
  • Map集合、散列表、红黑树介绍
  • mysql 5.6 原生Online DDL解析
  • Promise面试题,控制异步流程
  • Python利用正则抓取网页内容保存到本地
  • scrapy学习之路4(itemloder的使用)
  • Spring核心 Bean的高级装配
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 扑朔迷离的属性和特性【彻底弄清】
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 提醒我喝水chrome插件开发指南
  • 微信开源mars源码分析1—上层samples分析
  • 译有关态射的一切
  • 原生js练习题---第五课
  • C# - 为值类型重定义相等性
  • 我们雇佣了一只大猴子...
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (3)(3.5) 遥测无线电区域条例
  • (3)llvm ir转换过程
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (C语言)fgets与fputs函数详解
  • (Java)【深基9.例1】选举学生会
  • (第二周)效能测试
  • (三)c52学习之旅-点亮LED灯
  • (四)Controller接口控制器详解(三)
  • (一)Dubbo快速入门、介绍、使用
  • (转)大型网站架构演变和知识体系
  • ***利用Ms05002溢出找“肉鸡
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复