前言

先看一段代码

#ifndef  _INLINE_H
#define  _INLINE_Htemplate<typename T>
static inline
T my_max(T a, T b)
{a *= 2;b /= 3;return (a>b) ? a : b;  //找出最大值
}#endif

代码本身逻辑很简单,无外乎简单的找出两个T类型变量中大者。

这里有几个关键字的用法很值得深究,特此记录下感想。

inline

简单的理解inline就是,他只有带参宏的优点,没有带参宏的缺点。但实际情况,这可能仅仅是Programmer的一厢情愿。因为啥? inline和register的行为很像,正确的理解方式是,这两个关键字是programmer对compiler的一种建议。至于你的建议会不会被compiler所接纳,那是compiler的事,我们不应该对compiler有任何假设。因此上面代码中是对然你加了inline,最终效果可能和不加inline的normal function一样。

static

要想理解此处static的作用,首先想像我们经常遇到的重复定义error。软件开发中遇到的重复定义error,99%都是来自于global空间被“污染”。为啥这么说?对于文件作用域内的variable or function,重复定义情况你是很容易发现的,都写在一个文件中,打眼一看就知道有没有冲突。然而实际开发中,多人协作开发,global空间有啥东西谁也不清楚。对于那些拍脑子乱加global variable or function 的人更是如此,可能他自己“污染”了global空间,自己都不知道。

想想哪些地方可能会导致global空间被“污染”,嗯....头文件(.h)和.c文件

.h文件

对于在.h里面的强符号,应该始终秉持这样一种观点:尽可能将header files封锁在include他的单个.c文件。除非对那些必须要共享的variable or function,其余强符号最好加上static。虽然header guard帮我们避免了一份头文件多次包含的情况,确保整个头文件在最终可执行文件中只有一份。但是header guard无法保证header files中的强符号与其他人.h  or  .c文件中的强符号发生重复定义风险。

.c文件 

对于.c中的强符号,如果不想被他人使用 或者 可能给他人带来风险,最好加上static,将其锁死在文件作用域。

软件开发是个多人合作活动,对于编码问题上的风险,我们应该将其扼杀在萌芽中。一个良好的编码规范无疑是重要的。核心代码必须有企业自己把握,业务代码(简单扩充函数)完全可以外包出去,外包出去的代码质量由公司内部人员把控。这样可以进一步缩减人力成本。

variable hides

#include <stdio.h>int var = 20;
int main()
{int var = var;printf("%d\n", var);return 0;
}

variable hides很好理解,The local variable always hides a global one of the same name as soon as it's declared.

那么换成function hides呢?

我们知道C不支持overloading,C++支持overloading。C++下最终识别到的函数名字类似于这样:

那有没有这种可能?

某个.c内的static function 和 某个 global function在compiler那一侧解析的名字完全一致,那不就会存在类似于variable hides的情况了吗?虽然这种情况概率比较低,但是面对百万行代码的时候还是难免不会遇到。

事实上,这个问题完全是多虑了。

之所以会想到这个奇怪的问题,其根源是对作用域问题的思考。上层上讲就是谁的作用域有效,低层上函数名就是个地址,地址值都不一样。因此最终翻译成二进制代码的时候是不会出现function hides的情况的。

转载于:https://www.cnblogs.com/kelamoyujuzhen/p/10173365.html

关于header file、static、inline、variable hides的一点感想相关推荐

  1. Cannot open precompiled header file: 'Debug/***.pch': No such file or directory

    Cannot open precompiled header file: 'Debug/*.pch': No such file or directory 今天在VC6.0中咕哝个程序,遇到如下提示: ...

  2. 【linux】Linux kernel uapi header file(用户态头文件)

    uapi目录的创建原因 Linux在3.7以后把很多header file移到 include/uapi或是arch/xxxx/include/uapi下,为了解决include recursive( ...

  3. Cannot open precompiled header file:'Debug/password.pch' No such file or directory

    今天在VC6.0中咕哝个程序,遇到如下提示: Cannot open precompiled header file:'Debug/password.pch' No such file or dire ...

  4. 关于编译错误 fatal error C1083: Cannot open precompiled header file

        今天编译一个比较大的工程时,总是遇到这样的编译错误,想必凡是用过VC6.0做过比较大的程序或者做过MFC开发的朋友都遇到过.错误提示如下,fatal error C1083:Cannot op ...

  5. (转)fatal error C1853: precompiled header file is from a previous version of the compiler, or the pre

    预编译头文件来自编译器的早期版本,或者预编译头为C++而在C中使用它(或相反) 当Visual C++项目启用了预编译头(Precompiled header)功能时,如果项目中同时混合有.c和.cp ...

  6. Cannot open precompiled header file: 'Debug/****.pch': No such file or directory

    环境:VC 执行:编译程序 问题描述:Cannot open precompiled header file: 'Debug/****.pch': No such file or directory ...

  7. vue打包时候报错(压缩css错误) building for production...Error processing file: static/css/app.e8b75d3d19abc5bbb

    报错信息如下 \ building for production...Error processing file: static/css/app.e8b75d3d19abc5bbbd9bd916f45 ...

  8. C/C++中inline/static inline/extern inline的区别及使用

    引入内联函数的目的是为了解决程序中函数调用的效率问题,也是用内联函数取代带参宏定义(函数传参比宏更加方便易用) inline关键字用来定义一个类的内联函数. 在类体中和类体外定义成员函数是有区别的:在 ...

  9. auto make System.map to C header file

    #!/bin/bash# auto make System.map to C header file # 说明: # 该脚本主要是将Linux内核生成的System.map文件中的符号.地址存入结构体 ...

最新文章

  1. letswave7中文教程2:脑电数据预处理-通道位置分配
  2. 找圈圈 (BFS简单运用)
  3. Java环境变量的配置 (Win10环境下)
  4. 当重复调用addsubview时出现显示重叠问题
  5. DOTNET Core MVC(二)路由初探
  6. 微博短链接解析ShortUrl【PHP代码实现】
  7. Introduction to Computer Networking学习笔记(二十八):DNS
  8. 一个最基本最简单的爬虫代码【精简】
  9. 内蒙古自治区包头市谷歌高清卫星地图下载
  10. 需求分析师如何做好非功能性需求
  11. H264 帧格式 封装 传输
  12. Halcon create_pose算子帮助文档翻译
  13. Myeclipse9.0 正式版64位JDK 之win7下的完美破解
  14. 一条命令搞定黑苹果双系统时差
  15. 手机上的计算机黑屏怎么办,手机黑屏是怎么回事,教您苹果手机黑屏怎么办
  16. css 横线中间的文字
  17. 常用的ddos防护方式
  18. 名悦集团:女司机第一辆车买手动挡还是自动挡?
  19. 营改增,营业税与增值税的区别
  20. python 网页上显示数据_怎么用python将excel数据写入网页中,python 网页上excel表格数据分析...

热门文章

  1. 基于ssm企业后勤订餐管理系统的设计与实现-计算机毕业设计源码+LW文档
  2. js中动态获取页面的高度和宽度的方法总结
  3. Quoted-printable编码的介绍和quopri库的使用
  4. PCIe数据卡设计资料第611篇:基于VU9P的双路5Gsps AD 双路6Gsps DA PCIe数据卡
  5. win10计算机管理看不见蓝牙,Win10设备管理器找不到蓝牙设备的解决方案
  6. 互联网时代/数据分析时代,一张思维导图带你学习数据分析的思路
  7. Codeforces Problem-69A Young Physicist
  8. Android开发酒店预定预约管理系统
  9. 如何用PS把照片变成红/白/蓝底
  10. markdown还需要图床?你out了!用base64代替图床!