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
一个圆,圆内是你会的,圆外是你不知道的。而当圆越大,你知道的越多,不知道的也越多了