本文主要讨论static在C++中的应用
(1)static修饰全局变量和局部变量
全局变量属于数据,不是放在.data段,就是在.bss段;如果是一个常量字符,那么存储于.rodata段;
局部变量属于指令,存储于.text段,运行时系统为其分配栈上空间,函数的局部变量此时表示栈上的一段内存;那么加了关键字之后有何变化呢?请看如下代码:
int gdata1 = 10;//全局变量
int main()
{
int gdata2 = 20;//局部变量
printf("gdata2 = %d\n",gdata2);
}
通过objdump -t *.o查看到他们在段上的布局如下图:
从上图可以看到gdata1存放在.data段,gdata2存放在.text段;加上关键字static之后,打印段表信息如下图所示:
从两个图可以分析出gdata1从global符号变为local符号并且仍然存储在.data段,gdata2由存放在.text段变为存放在.data,此时它是一个local的数据,由于local符号外部文件不可引用,所以不参与符号解析,因此同一工程里多个源文件定义同名的静态全局变量,不会产生重定义错误。
(2)static修饰普通函数
static函数,经过编译链接产生一个local符号,不参与符号解析,因此其他文件不能引用此函数;
(3)