函数名前加static的作用
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的作用相关推荐
- 函数名前加static与不加static的区别
函数名前有无static关键词修饰的区别 引入 static修饰特点 代码示例 代码1(对应第1点) 代码2(对应第2点) 代码3(对应第3点) 总结 引入 在定义函数时,前面有时会有static关键 ...
- 关于函数名前加static的一些解释
遇到有函数名前有加static的函数,不太懂什么意思.上网查了一下,网上有两种说法.现复制整理了一下,有兴趣的可以看一下 说法一: 在函数的返回类型前加上关键字static,函数就被定义成为静态函数. ...
- 调用函数时为什么要在函数名前加“(void)”
我们知道,在定义函数时,加在函数名前的"void"表示该函数没有返回值.但在调用时,在函数名前加"(void)"的作用又是什么呢? 最明显的一点就是表示程序并不 ...
- 调用函数时在函数名前加“(void)”
在定义函数时,加在函数名前的"void"表示该函数没有返回值.但在调用时,在函数名前加"(void)"的作用又是什么呢? 最明显的一点就是表示程序并不关心调用该 ...
- php 调用变量方法名,php中引用(变量和函数名前加符号)用法
本文章来给大家介绍在php中我们常看到在在php变量前面加个&符号,这个就是php中引用符号了,它可以用于各种变量.函数.对象了下面我来给各位详细介绍php&符号用法.在 PHP 中引 ...
- 函数名前加::的缘由
函数名前加::的缘由 在开发MFC之前,自己开发的是以AFx(ApplicationFrameworks,x是没有什么意义的)开头的一些函数.但是那个时候开发的函数并没有进行封装,但是有很多很有用的函 ...
- 函数名前加 符号的深入理解 C++
#include <iostream>using namespace std;int& test_str() {int a = 1;return a; //通过返回 a 的地址来进 ...
- 在C++中,函数名前的const和函数名后的const的区别
首先要知道函数名后面加const只能用于成员函数. int const func(); //合法,相当于const int func(); int func2() const; //非法,对函数的co ...
- 下载数据库名前加“#”方法
数据库名前加"#" 只需要把数据库文件前名加上"#",然后修改数据库连接文件(如conn.asp)中的数据库地址.原理是下载的时候只能识别"#&quo ...
最新文章
- CentOS7 安装并使用Ovirt 4.2
- java获得服务器路径的几中方法
- Linux有问必答:如何为在Linux中安装兄弟牌打印机
- Django(part38)--制作登录界面
- 持续定义Saas模式云数据仓库+BI
- 江西小学计算机说课稿,2019江西教师招聘面试-小学数学-说课稿
- win8计算机管理员权限删除文件,win8系统使用管理员权限无法删除部分文件怎么办...
- 4-2 ADO.NET-查询和检索数据13
- java:去除字符串中空格 、 oracle (+) 、 mysql中数值运算符和函数
- uni-app 实现微信授权登录
- java 新增的方法外部调用提示不存在_Java面试简答题(一)
- atitit...触发器机制 ltrigger mechanism sumup .的总结O8f
- 数据库:候选码、主码、超码、外码、主属性、非主属性
- java beetl输出demo_Beetl 快速入门
- python矩阵运算法则_python怎么进行矩阵运算?
- 程序员需要的日常(收费)软件(都免费)
- 关于vs新建项目时只有空白项
- Rocket MQ发送消息报错: service not available now
- 738. Monotone Increasing Digits
- 从后台获取的图片渲染到前端页面