static

先思考一个问题,static修饰一个变量的作用是什么?

  • 它的名字叫做局部静态变量或者全局静态变量,那这个变量到底可以干什么?
  • 它有一个作用就是为了让该变量只在自己的编译单元中可见。对于外部文件不可见。

编译单元是什么?

举个例子吧:
现在有一个1.h 文件 内部定义了全局静态变量 static int a = 1;
然后有一个1.c文件包含了1.h, 那这个1.c就可以使用这个a变量。
但是现在我们又有一个2.c文件(没有包含1.h文件),它的内部用extern int a; 声明了a。
然后我们用Makefile将这些文件整合在一起,在make的时候就会报错,2.c 对“a”未定义的使用,在链接的时候虽然a是全局的变量,但是用static进行了修饰,它们不属于一个编译单元,所以会产生报错。

  • 我们可以通过这个例子理解一下编译单元的概念 ,该例子中1.h 1.c是一个编译单元 , 2.c是一个编译单元。

理解了编译单元和static对于变量修饰的作用之后其实static对于函数的修饰和对变量的修饰作用差不多。

staic修饰函数

我们只说全局的函数,不说类中的static函数。 全局函数被static修饰了之后,该函数也就只在编译单元中可见,对于外部文件不可见。理由和上述修饰变量一样。我们用代码给大家举个例子

test1.cpp文件
#include<iostream>
static int setnonblocking(int fd)
{std::cout << "lalala\n";
}test.cpp
#include<iostream>
extern int setnonblocking(int fd);
int main()
{int listenfd =  3;setnonblocking(listenfd);
}Makefile
main: test.o test1.og++ -o main test.o test1.o
test.o: test.cppg++ -c test.cpp
test1.o: test1.cppg++ -c test1.cpp

make之后就会产生如下报错:

上例中test.cpp 是一个编译单元, test1.cpp是一个编译单元

希望这篇文章可以帮助大家理解staic的一个作用。

函数名前加static的作用相关推荐

  1. 函数名前加static与不加static的区别

    函数名前有无static关键词修饰的区别 引入 static修饰特点 代码示例 代码1(对应第1点) 代码2(对应第2点) 代码3(对应第3点) 总结 引入 在定义函数时,前面有时会有static关键 ...

  2. 关于函数名前加static的一些解释

    遇到有函数名前有加static的函数,不太懂什么意思.上网查了一下,网上有两种说法.现复制整理了一下,有兴趣的可以看一下 说法一: 在函数的返回类型前加上关键字static,函数就被定义成为静态函数. ...

  3. 调用函数时为什么要在函数名前加“(void)”

    我们知道,在定义函数时,加在函数名前的"void"表示该函数没有返回值.但在调用时,在函数名前加"(void)"的作用又是什么呢? 最明显的一点就是表示程序并不 ...

  4. 调用函数时在函数名前加“(void)”

    在定义函数时,加在函数名前的"void"表示该函数没有返回值.但在调用时,在函数名前加"(void)"的作用又是什么呢? 最明显的一点就是表示程序并不关心调用该 ...

  5. php 调用变量方法名,php中引用(变量和函数名前加符号)用法

    本文章来给大家介绍在php中我们常看到在在php变量前面加个&符号,这个就是php中引用符号了,它可以用于各种变量.函数.对象了下面我来给各位详细介绍php&符号用法.在 PHP 中引 ...

  6. 函数名前加::的缘由

    函数名前加::的缘由 在开发MFC之前,自己开发的是以AFx(ApplicationFrameworks,x是没有什么意义的)开头的一些函数.但是那个时候开发的函数并没有进行封装,但是有很多很有用的函 ...

  7. 函数名前加 符号的深入理解 C++

    #include <iostream>using namespace std;int& test_str() {int a = 1;return a; //通过返回 a 的地址来进 ...

  8. 在C++中,函数名前的const和函数名后的const的区别

    首先要知道函数名后面加const只能用于成员函数. int const func(); //合法,相当于const int func(); int func2() const; //非法,对函数的co ...

  9. 下载数据库名前加“#”方法

    数据库名前加"#" 只需要把数据库文件前名加上"#",然后修改数据库连接文件(如conn.asp)中的数据库地址.原理是下载的时候只能识别"#&quo ...

最新文章

  1. CentOS7 安装并使用Ovirt 4.2
  2. java获得服务器路径的几中方法
  3. Linux有问必答:如何为在Linux中安装兄弟牌打印机
  4. Django(part38)--制作登录界面
  5. 持续定义Saas模式云数据仓库+BI
  6. 江西小学计算机说课稿,2019江西教师招聘面试-小学数学-说课稿
  7. win8计算机管理员权限删除文件,win8系统使用管理员权限无法删除部分文件怎么办...
  8. 4-2 ADO.NET-查询和检索数据13
  9. java:去除字符串中空格 、 oracle (+) 、 mysql中数值运算符和函数
  10. uni-app 实现微信授权登录
  11. java 新增的方法外部调用提示不存在_Java面试简答题(一)
  12. atitit...触发器机制 ltrigger mechanism sumup .的总结O8f
  13. 数据库:候选码、主码、超码、外码、主属性、非主属性
  14. java beetl输出demo_Beetl 快速入门
  15. python矩阵运算法则_python怎么进行矩阵运算?
  16. 程序员需要的日常(收费)软件(都免费)
  17. 关于vs新建项目时只有空白项
  18. Rocket MQ发送消息报错: service not available now
  19. 738. Monotone Increasing Digits
  20. 从后台获取的图片渲染到前端页面

热门文章

  1. MySQL笔试题练习及答案(一)
  2. undo_retention:确定最优的撤销保留时间
  3. 英语总结改错2011 英一
  4. 为什么学习python?(知乎大神的回答)
  5. 微博API:获取用户发布的微博
  6. windows监控磁盘IO、cpu、内存、网络等使用情况
  7. text-align中justify属性的使用方法
  8. Java 面试题(一)
  9. vscode调试C/C++的.vscode配置
  10. 使用多种机器学习进行客户预流失与否预警的方法