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

前言ide

先看一段代码函数

#ifndef  _INLINE_H
#define  _INLINE_H

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

#endif

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

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

inline翻译

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

staticblog

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

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

.h文件it

对于在.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的状况的。

相关文章
相关标签/搜索