c static的几个问题

问题

1. 有 extern static int fun()  这种写法么?
2. extern int fun() 和  int func()  有区别吗
3. static函数的汇编和普通函数汇编的区别
4. static函数 是在编译的哪一个步骤,让其他想使用该函数的地方报错
5. static 加在函数实现前还是函数声明前

初始说明

程序编译的四个过程:预编译--》编译--》汇编--》链接

1. 问题一解答

​ 没有,因为是冲突的

​ extern 代表的是外部的 、外部声明链接的

​ static 代表的是静态的、本地声明的

​ 那么 extern static 就出现了既是 extern 又是 static

​ 在编译的时候直接报错 multiple storage classes in declaration specifiers

​ 说明在编译这个阶段就不允许此用法

2. 问题二解答

​ 没有区别,默认的int fun() 是和 extern等同的

​ 但是 static int func(); 是允许的,因为没有显示的声明extern

3. 问题三解答

​ 汇编后发现,差别就在 .globl 函数名称 这一汇编

​ 这带来的就是 链接的时候 .globl函数 无法被其他文件访问

4. 问题四解答

​ 在链接步骤,也是因为问题三的解答,链接的时候 当前使用static函数的文件无法找到 该函数的定义

​ 报错:undefined reference to `print'

5. 问题五解答

​ 对于当前文件

1. 当实现前面加 static, 声明必须加static
2. 当声明前面加static,实现可以不加static

总价

​ 当我们使用static作用函数的时候

1. 在实现函数的文件 前直接对static 函数声明, 推荐在 实现函数前 + static 声明
2. 另一种用法是 static 在头文件 配合inline实现 内联函数,这个时候就是 static inline
posted @ 2021-03-09 13:49  make_wheels  阅读(156)  评论(0编辑  收藏  举报