作用域

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了作用域相关的知识,希望对你有一定的参考价值。

;作用域,编译器控制的作用域,
块作用域可以用指针绕过编译器的规定,不过这没什么意义
1.1块作用域 里面的变量作用域只在当前左花括号到另一个右花括号之间,典型的如if 循环等后面的花括号就是块作用域
 
 
void adminIndex(){
{
int a;
}
printf("%d",a);//a虽然还分配在当前栈空间,但是编译器人为的做了名称粉碎,加了作用域限制 如果函数1级那么这块作用域就是2级,printf打印找变量a并且作用域是1的没有就是undefind
}
1.2函数作用域
函数左花括号到另一个右花括号之间(参数,局部变量),都有效果
;ok正确
void adminIndex(){
int a;
{
printf("%d",a);//a是函数作用域,当前函数内部处处有效
}
}
1.3文件作用域
static char username1[50]="xiaoming";
static char passwd1[50]="lovexiaoming";
static unsigned int passwd2;
这几个静态全局变量只在当前文件有效,也就是说属性为私有只有当前文件内部能访问使用它们,别的文件内部就不能访问了
 
int *enCode(char *str){
static unsigned int passwd2; 静态局部变量,那么就只有我这个函数能访问了,这是我的私有属性,外部是不能访问的,我可以提供接口给你访问
char *res=str;
while(*res){
passwd2+=(((int)*res << 21) >> 7);
        *res=‘h‘;
        res++;
}
srand((unsigned)time(NULL));
return &passwd2;
}
 
static int _enCode(char *str){  静态局部函数(私有) 那么也就只有我当前文件能访问了,别人想访问可以通过公开接口
static unsigned int sds;
char *res=str;
while(*res){
passwd2+=(((int)*res << 21) >> 7);
        *res=‘h‘;
        res++;
}
    srand((unsigned)time(NULL));
return &passwd2;
}
void encode(){
_enCode(str);
}
 
 
;工程作用域
void add();
int globle=100;//main文件中定义全局变量
////////////////////////////////////////////
add文件
#include <stdio.h>
extern int globle; //add文件中垮文件访问add变量并输出 
void add(){
printf("%d\n",globle);
}
 
;生命期一般说的是变量(内存的某处存储空间),从定义(申请)到销毁
;一个进程打开,就会立马把文件的东西搬到内存中去,关闭进程相当于文件存档到磁盘,打开在加载到内存(全局变量的数据在程序进程创建时候就搬到内存中了很早)
一个exe相当于一个主模块,运行时需要转入的dll等是子模块,exe销毁进程就关闭了
总结:
;全局变量垮工程,文件等域,静态全局变量相当于受约束的全局(本文件),静态局部变量(本函数)相当于受约束的静态全局变量
c语言全局变量,静态全局变量,静态局部变量,初始化时候只能为常量,c++可以变量,
;c++中编译器会把你定义的任何变量都重新生成名字(名称粉碎法)
 
;全局变量,静态全局变量,静态局部变量在内存的分布
它们都在常量区没什么区别,只是在访问时有作用域的问题是编译器使用了名称粉碎法做了访问限制,
;code
#include <stdio.h>
#include <stdlib.h>
static int a=10;
int b=11;
int main(){
static c=7;
printf("%p\n%p\n%p\n",&a,&b,&c);
getchar();
return 0;
}

以上是关于作用域的主要内容,如果未能解决你的问题,请参考以下文章

在主函数以外的函数中使用 std::async 时的作用域块

在使用 std::unique_ptr 在退出作用域块时自动释放内存的情况下,为啥不直接使用堆栈呢?

作用域和闭包

作用域和闭包

作用域

javascript中的作用域