首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C语言关键字详解(二) 带你全面了解 static 关键字

,其实它是用来防止头文件被反复包含,举个栗子 如上所示:test.h包含了头文件,但是在main.c又同时包含了test.h 和 stdio.h ,这就造成了stdio.h...防止头文件反复包含另一种方法(涉及预处理内容,暂时不讲,同学们当作了解即可) 4、多文件在代码具体体现 在上图中我们在test.c 文件定义了一个全局变量和一个函数,然后在test.h...2、static修饰全局变量 图一图二对比分析:在Add.c定义了一个全局变量g_val,因为全局变量具有外部链接属性,所以我只需要在test.c对g_val进行声明之后就可以正常使用了,但是当我用...(只能在本文件内部被访问),给我们感觉是全局变量作用域变小了。...3、static修饰函数 图一图二对比分析:这里和 static 修饰全局变量非常类似,在Add.c定义了一个Add函数,因为函数也具有外部链接属性,所以我只需要在test.c对Add函数进行声明之后就可以正常使用了

32600

c语言存储类里关键字(一)

(既然在栈上,说明它如果初始化那么值就是随机······)。 (3)平时定义局部变量时就是定义auto,只是省略了auto关键字而已。...本质区别是存储类不同(存储类不同就衍生出很多不同):非静态局部变量分配在栈上,而静态局部变量分配在数据段/bss段上, 在数据段的话,它是初始化,在bss段的话,一般我们没有初始化,一般默认0,这个和全局变量初始化一样...这里的话举几个例子来说明: 没用static关键字修饰: #include void test() { int num = 0; num...static修饰函数/全局变量属于内链接。 (3)无连接意思就是这个符号本身参与链接,它跟链接没关系。所有的局部变量(auto、static)都是无连接。...),一般在stm32里面会使用这个static关键字来修饰函数,所以这个函数就只能在这个文件内使用了,不能在外部再使用这个函数了(这个函数作用域只能在当前文件内),其实和上面讲全局变量和静态全局变量区别类似

48350
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++:21---仿函数

    怎么样找到以上两个函数一个折中解决方案呢?  有三种解决方案可以考虑: 1、函数局部变量; 局部变量不能在函数调用传递,而且caller无法访问。...原因有以下几点要考虑: 1、容易出错;   为什么这么说呢,我们必须先初始化maxLength值,才能继续接下来工作,如果我们忘了,则可能无法得到正确答案。...3、全局变量问题;   每当新建一个全局变量,即使是为了coding便利,我们也要知道我们应该尽可能少使用全局变量,因为它cost很高;而且可能暗示你这里有一些待解决优化方案。   ...class Test{ public: explicit Test(int lenth) : len(lenth){} bool operator() (const...  仿函数其实是上述解决方案第四种方案:成员变量。

    49930

    C++内存分区模型分析与实例以及扩展

    3、静态区:全局变量和静态变量存储是放在一块初始化全局变量和静态变量在一块区域,未初始化全局变量和未初始化静态变量在相邻另一块区域。程序结束后,由系统释放。...为什么?...(pm); // 动态规划堆空间;仅归还堆空间,触发析构函数调用;这里不能用 delete pm,因为这样会对非法对象调用构造函数,而对于析构函数 delete mp 来说,这样影响是深远,不知道什么时候就会带来...为什么?...dynamic_cast 使用是否正确; 1,在 C++ 编译器得到足够重视,是非常有地位一个类型转换关键字; 2,使用不正确编译器会报错; 5,类型转换结果只可能在运行阶段才能得到

    78241

    最全面的c++构造函数高级使用方法及禁忌

    说明一下,是gcc7.1.0编译器,标准库源代码也是这个版本。 本篇文章讲解c++,构造函数高级用法以及特殊使用情况。 1....: 在函数‘int main()’: test.cpp:32:12: 错误:使用了被删除函数‘CPtr::CPtr(CPtr&)’ CPtr p2(p1); 说明声明为=delete以后不再允许调用...,在存在动态内存class里面使用移动构造就要小心了,一不小心就会出现问题哦,具体移动构造怎么实现可以参考上面第一点代码。...以上三种情况都必须使用初始化列表而不能在构造函数中进行赋值。 7....什么构造函数会在main函数之前执行 想当年面试时候想破头都想不出来这个问题,因为main函数是程序入口嘛,但其实这个问题很简单,根据程序执行规则,在main函数之前,会先处理全局变量和局部静态变量

    1.7K30

    硬钢百度面试!

    所以在实现多态时,当用基类操作派生类,在析构时防止只析构基类而析构派生类状况发生,要将基类析构函数声明为虚函数。 为什么构造函数写为虚函数?...定义时要分配空间,不能在类声明初始化,必须在类定义体外部初始化初始化时不需要标示为static;可以被非static成员函数任意访问。...,但是只能在该函数内进行使用该静态局部变量, extern作用(作用域扩展) 将全局变量作用域扩展到其定义之前:如果全局变量不在文件开头定义,其作用范围只限定于从定义处到文件结尾,如果在定义点之前函数想引用该变量...如果在一个文件想引用另一个文件已定义全局变量,比如现在两个文件都要使用到同一个全局变量int a,正确做法应该是:在一个文件定义变量a,而在另一个文件中使用extern int a;对该变量进行声明...考虑类情况 const成员变量:不能在类定义外部初始化,只能通过构造函数初始化列表进行初始化,并且必须有构造函数;不同类对其const数据成员值可以不同,所以不能在声明时初始化

    18620

    ECMAScript 6入门 - let和const命令详解

    为什么需要块级作用域?...与let命令相同 只在声明所在块级作用域内有效 声明不提升 存在暂时性死区,只能在声明位置后面使用 不可重复声明 只保证变量名指向地址不变,并不保证该地址数据不变 对于复合类型变量,变量名指向数据...window.a = 1; a // 1 a = 2; window.a // 2 上面代码,全局对象属性赋值与全局变量赋值,是同一件事。...ES6为了改变这一点,一方面规定,var命令和function命令声明全局变量,依旧是全局对象属性;另一方面规定,let命令、const命令、class命令声明全局变量,不属于全局对象属性。...undefined 上面代码全局变量a由var命令声明,所以它是全局对象属性;全局变量b由let命令声明,所以它不是全局对象属性,返回undefined。

    82250

    死磕JS:var、let、const 该怎么选?

    函数体为 函数作用域, 任意一个 {} 内为一个 块级作用域 var 声明变量,在函数作用域 中生效,所以只有在函数声明变量属于局部变量,在代码块声明依然为全局变量。...,var 声明变量会成为 window 对象属性, let 和 const 不会; 3、定义在 window 全局变量推荐使用 var 声明 或 省略关键字直接定义,推荐使用 window.message...var message = 'hello'; } test(); 是不是结果很令人费解,为什么打印不是 'hi',而是 undefined ?...,在预加载时候 message 作用域范围也就被框定了,message 变量不再属于全局变量,而是属于函数作用域,只不过赋值操作是在运行期执行(这就是为什么 Javascript 语言在运行时候会改变变量类型...const 声明变量,声明时必须同时初始化赋值,且不支持修改,所以也不会提升。 注意:const 声明不可修改限制只适用于它指向变量引用。

    1.9K10

    C++基础闯关100题,你能闯多少?【2021超硬核大厂高频面试题】

    全局/静态存储区,全局变量和静态变量被分配到同一块内存,在以前C语言中,全局变量又分为初始化和未初始化,在C++里面没有这个区分了,他们共同占用同一块内存区。...相同点: 两者都拥有成员函数、公有和私有部分 任何可以使用class完成工作,同样可以使用struct完成 不同点: 两者如果不对成员指定公私有,struct默认是公有的,class...;不同类对其const数据成员值可以不同,所以不能在声明时初始化。...static: 不考虑类情况 隐藏。所有不加static全局变量和函数具有全局可见性,可以在其他文件中使用,加了之后只能在该文件所在编译模块中使用。...定义时要分配空间,不能在类声明初始化,必须在类定义体外部初始化初始化时不需要标示为static;可以被非static成员函数任意访问。

    2K20

    搞懂JavaScript全局变量与局部变量,看这篇文章就够了

    2.全局变量和局部变量声明 2.1 全局变量声明 在js全局变量声明方式分为显示声明和隐式声明。...:使用window全局对象来声明,全局对象属性对应也是全局变量,例如: window.test3 = 'window全局对象声明全局变量'; console.log(test3);//结果:window...全局对象声明全局变量 2.2 局部变量声明 声明局部变量一定要使用var关键字,使用var关键字声明变量时,变量会自动添加到距离最近可用环境。...如果没有写var, 变量就会暴露在全局上下文中, 成为全局变量。如果变量在未声明情况下被初始化,该变量会自动添加到全局环境。...); //结果:是局部变量 }() 为什么不是: 全局变量是局部变量?

    20.9K42

    Java面向对象编程基础

    test100,可以接收一个数组,在方法修改该数组,看看原来数组是否变化?...3.java作用域分类 全局变量:也就是属性,作用域为整个类体 (Cat类:cry eat等方法使用属性) 局部变量:也就是除了属性之外其他变量,作用域为定义它代码块!...4.全局变量(属性)可以赋值,直接使用,因为有默认值,局部变量必须赋值后, 才能使用,因为没有默认值。...4.作用域范围不同 全局变量/属性:可以被本类使用,或其他类使用(通过对象调用) 局部变量:只能在本类对应方法中使用 5.修饰符不同 全局变量/属性可以加修饰符 局部变量不可以加修饰符 构造方法/构造器...:this(参数列表); 注意只能在构造器中使用(即只能在构造器访问另外一个构造器, 必须放在第一条语句) public class ThisDetail { //编写一个main方法

    26810

    【C++】详解命名空间

    ,结果发现失败了,失败原因是——未定义标识符'b'; 现在大家是不是会奇怪,明明在命名空间中定义了,为什么无法使用呢?...知道,如果仅仅是通过文字来进行复习,大家可能没有什么感觉,下面我们通过例子来分别说明全局变量与局部变量生命周期与作用域: 在这次测试我们在原先项目test3.cpp创建了一个全局变量m、一个函数...下面我们把这个代码屏蔽后再来运行一下,看是什么结果: 这一次结果我们可以看到,对于该项目中全局变量m因为我们并未赋予初始值,所以全局变量自动初始化为0;对于另一个项目中全局变量y我们在创建时对其初始化为...20,并通过extern这个关键字进行了全局变量声明,因此它结果就是我们初始化结果;而对于局部变量z,当我们将test5函数对z进行访问代码屏蔽后,此时程序正常运行,并在func2函数成功进行了访问...这个例子就能很好说明全局变量与局部变量作用域和生命周期: 作用域 对于全局变量m而言,它作用域是它所在项目test3.cpp,所以我们能在该项目中正常使用; 对于全局变量y而言,它作用域是它所在项目

    9710

    从零开始学C++之对象使用(一):static 成员变量、static 成员函数、类对象大小

    如果我们用全局变量会破坏数据封装,一般用户代码都可以修改这个全局变量,这时可以用类静态成员来解决这个问题。...(1)、static成员定义 static成员需要在类定义体外进行初始化与定义 (2)、特殊整型static const成员 整型static const成员可以在类定义体初始化,...该成员可以不在类体外进行定义 class Test { public:     Test(): a(0) {}     enum {size1 = 100, size2 = 200}; private...:     const int a;   //只能在构造函数初始化列表初始化     static int b;    //在类实现文件定义并初始化     const static int c;...}; int Test::b = 0; //static成员变量不能在构造函数初始化列表初始化,因为它不属于某个对象。

    1.2K00

    单片机到底是如何软硬件结合(深度好文)

    我们通过IO和串口软件开发,已经体验了嵌入式软件开发。不知道大家有没有疑惑,为什么软件能控制硬件?反正当年学习51时候,有这个疑惑。今天我们就暂停软件开发,分析单片机到底是如何软硬件结合。...是我们在main.c定义main函数吗?2 分散加载文件*(InRoot$$Sections)是什么?3 ZI段,也就是初始化为0数据段,什么时候初始化?谁初始化?...const用处比较多,可以修饰变量,也可以修饰函数。更多用法自行学习 ? 那局部变量存放在哪里呢?我们找到了test_tmp3, ? 没找到test_tmp1/test_tmp2,为什么呢?...在定义时,test_tmp3增加了static定义,意思就是静态局部变量,功能上,相当于全局变量,定义在函数内,限制了这个全局变量能在这个函数内使用。...因为所有全局变量都需要一个初始化值(就算没有真正初始化,系统也会分配一个初始化空间),例如我们定义一个变量u8 i = 8;这样全局变量,8,这个值,就需要保存在FALSH区。 ?

    1.7K32

    java全局变量定义和声明_定义全局变量方法

    大家好,又见面了,是你们朋友全栈君。...JAVA全局变量(或称成员变量)可分两种,一种是静态变量,另一种是实例变量,即在类体定义变量,有三点得注意: 一、成员变量不能在类体先声明(定义)后赋值,但静态变量可以先在类体声明,然后在方法赋值...(当然实例变量是不行); 1)如以下程序会出问题: public class Test { static int a; //在类体声明整型静态变量a。...static void main(String[] args) { System.out.println("a+b="+(a+b)); } } java全局变量为什么不能先声明再赋值...public class Test{ int b; b=5; } 为什么这种先声明后赋值是错误?什么机制导致

    6.3K20

    PHPStatic(静态)关键字功能与用法实例分析

    2、为什么要引入static?...最容易想到方法是定义一个全局变量,但定义为一个全局变量有许多缺点,最明显缺点是破坏了此变量访问范围(使得在此函数定义变量,不仅仅受此函数控制)。 3、什么时候用static?...因为函数在程序运行中被调用,所以静态数据成员不能在任何函数内分配空间和初始化。...静态数据成员要实际地分配空间,故不能在声明定义(只能声明数据成员)。类声明只声明一个类“尺寸和规格”,并不进行实际内存分配,所以在类声明写成定义是错误。...它也不能在头文件类声明外部定义,因为那会造成在多个使用该类源文件,对其重复定义。

    1.3K41

    PHP之static静态变量详解(一)

    $a++; echo "";     echo $a; } test();//10 test();//11 test();//12 会发现,下面的static $a=9覆盖了上面定义...一、静态局部变量: 1、static类型内部变量同auto自动变量(即未加 static 声明局部变量)一样,是某个特定函数局部变量,即只能在定义该变量函数内使用该变量,两者作用域相同;两者不同在于...倘若再次调用定义它函数时,它又可继续使用,而且保存了前次被调用后留下值。换言之,static类型内部变量是一种只能在某个特定函数中使用,但一直占据存储空间变量。...2、函数体内如果在定义静态变量同时进行了初始化,则以后程序不再进行初始化操作(出现在函数内部基本类型静态变量初始化语句只有在第一次调用才执行)。...2、静态全局变量则限制了其作用域, 即只在定义该变量源文件内有效,在同一源程序其它源文件不能使用它。

    2.2K31

    C++类this指针,静态成员,友元函数友元类

    以前问过老师一个很逗比问题,给大家分享一下,代码简化一下就是这样class Animal { public: static int age; } Animal an[10]; for (int...i = 0; i < 10; i++) { aa[i].age = i; } 当我输出这10个对象age时候,懵了,10个age都是同一个值,且是最后一个数值,为什么,就是static这个关键字搞鬼...全局变量和静态变量区别: 对于定义在函数外面的变量被成为全局变量(或者叫外部变量),它作用域是整个工程,比如我在A.cpp定义了一个全局变量 :int A; 那么如果想在B.cpp中使用这个变量...,就可以在B.cpp中使用extern关键字来使用变量A :extern A; 静态变量包括静态全局变量和静态局部变量 和全局变量相比,静态全局变量作用域是定义它这个cpp文件,如果一个项目只有这一个...而静态局部变量只在定义它函数里面起作用,与普通局部变量相比,当函数返回后,静态局部变量并不会消失,而普通局部变量会消失。 静态变量和全局变量值在未初始化,都会被设定为0,而其他变量值设定随机。

    1.5K10
    领券