iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C/C++的关键字static怎么使用
  • 244
分享到

C/C++的关键字static怎么使用

2023-06-29 07:06:21 244人浏览 泡泡鱼
摘要

这篇文章主要介绍“C/C++的关键字static怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C/c++的关键字static怎么使用”文章能帮助大家解决问题。C语言隐藏场景演示当我们同时编译

这篇文章主要介绍“C/C++的关键字static怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C/c++的关键字static怎么使用”文章能帮助大家解决问题。

    C语言

    隐藏

    场景演示

    当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。会导致符号表认为存在同名全局变量和函数发生碰撞。

    场景:全局的变量/函数在.h中会在多个.cc文件中拥有且全局可见有链接问题。

    C/C++的关键字static怎么使用

    a.h

    #pragma once#include<stdio.h>void Test(){  printf("I am test..\n");}

    b.c

    #include"a.h"void call(){    Test();}

    c.c

    #include"a.h"int main(){   Test();   }

    makefile

    all:cc:c.o b.oGCc -o $@ $^ c.o:c.cgcc -c $^ b.o:b.cgcc -c $^ .PHONY:cleanclean:rm -rf *.o c

    运行结果

    C/C++的关键字static怎么使用

    此时查看b.oc.o符号表。(readelf -s xxx.o)

    C/C++的关键字static怎么使用

    C/C++的关键字static怎么使用

    可以看到双方的.o符号表中都认为有一个GLOBAL全局函数的Test,两者汇编阶段形成的符号表此时在汇总的阶段就会产生同名全局函数冲突。

    此时在两者的二进制文件里都认为各自拥有Test()函数,且都在全局。而全局函数只能有一个名字(注:重载是底层重新命名了)。虽然我们知道两个Test()是同一个,但是link的时候认为有两个同名函数实现,因此报link错。

    C/C++的关键字static怎么使用

    解决方法

    声明和定义分离

    养成声明和定义分离的习惯,在.h中只声明不定义。在.c文件中定义。

    C/C++的关键字static怎么使用

    a.h

    #include<stdio.h>void Test();

    a.c

    #include"a.h"void Test(){    cout<<"I am test..."<<endl;}

    makefile

    all:cc:c.o b.o a.ogcc -o $@ $^ c.o:c.cgcc -c $^ b.o:b.cgcc -c $^ a.o:a.cgcc -c $^ .PHONY:cleanclean:rm -rf *.o c

    C/C++的关键字static怎么使用

    为什么此时就可以正常运行了?

    依然查看符号表,可以发现b.o和c.o中此时只是给Test声明留了一个全局的NOTYPE位置。

    C/C++的关键字static怎么使用

    而在a.o中定义Test(),因此a.o中是func类型。

    C/C++的关键字static怎么使用

    最后三个.o文件链接的时候确定Test()实际在最后生成的.out文件中的虚拟内存地址。运行时加载到内存中,之后的详细过程就是linux创建进程中的事情。

    C/C++的关键字static怎么使用

    使用static关键字及缺陷

    那如果我就是想要直接在.h中存放一个公共的全局的对象来供其他所有文件使用呢?使用static关键字。

    a.h

    #pragma once#include<stdio.h>static void Test(){  printf("I am test..\n");}

    代码结构

    C/C++的关键字static怎么使用

    此时为什么又成立呢?两者.o文件中为什么对同名的全局函数包容了呢?可以看到此时两者的符号表中仍然是func,按照场景演示中的例子,应该报错的。

    C/C++的关键字static怎么使用

    此时反汇编查看Test()函数地址。我们发现此时生成了两个test函数,不过函数地址不同。

    结论:static函数作用域仅在自己所在文件,其实是编译后不同文件下的同名static函数会有不同的内部命名

    不同.c文件include了static变量之后该变量只在各自包含该变量的.c中可见。

    C/C++的关键字static怎么使用

    既然生成了两份,我们就可以发现,如果是一个静态的全局变量,我们分别进行修改实际上对两个不同的变量进行修改的。如果要解决全局变量统一性访问,保证全局变量不可变即可。另外一种方式就是使用单例模式。

    a.h

    #pragma once#include<stdio.h>static int a =0;

    b.h

    #include"a.h"void call();

    b.c

    #include"b.h"void call(){   a = 1;   printf("a=%d\n",a);}

    c.c

    #include"b.h"int main(){   a=2;   printf("a=%d\n",a);    call();   printf("a=%d\n",a);}

    C/C++的关键字static怎么使用

    保持变量内容的持久

    • 全局静态变量

    在全局变量前加上关键字static,全局变量就定义成一个全局静态变量。

    内存中位置:静态存储区,在整个程序运行期间移植存在。

    初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他是被显示初始化)。

    作用域:全局静态变量是从定义指出开始,到文件结尾,在声明他的文件之外是不可见的。

    • 局部静态变量

    内存位置:静态存储区

    初始化:未经初始化的局部静态变量会被自动初始化为0(自动对象的值是任意的,除非他是被显示初始化)。

    作用域:为局部作用域,当定义他的函数或者语句块结束时,作用域结束。但是当局部静态变量离开作用域后,并没有被销毁,依然驻留在内存中,只不过我们不能再对它进行访问,直到该函数再次被调用,并且值不变。

    如下的count变量作用域在test函数中,而生命周期是整个程序。在第一次进入test()的时候会初始化,之后进入test()就不再执行第5行代码了。

    #include<stdio.h>void test(){    static int count =0;    count++;}int main(){    for(int i =0 ; i < 10 ; i++ ) test();}

    默认初始化为0

    默认初始化为0:在静态存储区,内存中所有的字节默认值都是0x00。

    #include <stdio.h>int a;int main(void){    int i;    static char str[10];    printf("integer: %d;  string: (begin)%s(end)", a, str);    return 0;}

    Cpp

    static类成员变量

    声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;静态的成员变量一定要在类外进行初始化

    • 静态变量属于整个类,所有对象,生命周期在整个程序间运行

    • 在类成员函数中,可以随便访问

    static类成员方法

    用static修饰的成员函数,称之为静态成员函数。(因为该成员变量没有this指针)

    static成员函数,没有this指针,不使用对象就可以调用&ndash;>fun::。

    静态成员函数可以调用非静态成员函数(/成员)吗?不行。没有this指针

    非静态成员函数可以调用类的静态成员函数吗?可以

    class Date{    public:    Date(int year=0,int month=1,int day=1)        {        }    void f1()        {        }    static void f2()        {   f1();//没有this指针        }    private:}
    class Date{public:    void f3()        {            f4();//突破类域+访问限定符就可以访问 Date::f4();/对象.f4()            //类里面是一个整体都在类域中,类里面不受访问限定符限制        }    static void f4()        {        }private:};

    单例模式

    • 单例模式

    一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息,这种方式简化了在复杂环境下的配置管理。

    1.如何保证全局(一个进程中)只有一个唯一的实例对象

    参考只能在堆上创建对象和在栈上创建对象,禁止构造和拷贝构造及赋值。

    提供一个GetInstance获取单例对象。

    2.如何提供只有一个实例呢?

    饿汉模式和懒汉模式。

    3.使用场景

    由于全局的变量在.h中会在多个.cc文件中拥有且可见容易有链接问题。而static又只能在当前文件可见。因此真要处理成全局的就使用单例模式。

    具体的单例模式在特殊类设计中提及。

    关于“C/C++的关键字static怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网其他教程频道,小编每天都会为大家更新不同的知识点。

    --结束END--

    本文标题: C/C++的关键字static怎么使用

    本文链接: https://www.lsjlt.com/news/323478.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • C/C++的关键字static怎么使用
      这篇文章主要介绍“C/C++的关键字static怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C/C++的关键字static怎么使用”文章能帮助大家解决问题。C语言隐藏场景演示当我们同时编译...
      99+
      2023-06-29
    • C/C++中的static关键字详解
      目录C/C++ 中的 static1. 静态局部变量2. 静态全局变量3. static 修饰函数C++的 static 成员静态成员变量 静态成员函数总结:static是...
      99+
      2022-11-13
    • c语言中关键字Static怎么用
      这篇文章将为大家详细讲解有关c语言中关键字Static怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、可执行程序内存分配1. 可执行程序程序分段一个程序的3个基本...
      99+
      2022-10-19
    • C语言中的Static关键字怎么用
      这篇文章主要介绍C语言中的Static关键字怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、static关键字的基本含义首先,static关键字的意思是静态的,用于修饰局部变量,全局变量和函数,修改其数据储存...
      99+
      2023-06-26
    • C++ 中如何使用static关键字
      C++ 中如何使用static关键字,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、静态全局变量在全局变量前,加上C++ static关键字,该变量就被定义成...
      99+
      2023-06-17
    • C/C++的关键字之static你了解吗
      目录C语言隐藏场景演示解决方法保持变量内容的持久默认初始化为0Cppstatic类成员变量static类成员方法单例模式总结C语言 隐藏 场景演示 当我们同时编译多个文件时,所有未加...
      99+
      2022-11-13
    • C语言Static 关键字解析
      目录01简述02static关键字作用01简述 static关键字在嵌入式C语言当中很简单,它有三个作用: 作用一:在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变...
      99+
      2022-11-13
    • 关于C++中的static关键字的总结
      1.面向过程设计中的static1.1静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下: 复制代码 代码如下...
      99+
      2022-11-15
      c语言 static
    • c语言关键字static的作用是什么
      在C语言中,关键字static有以下几种作用:1. 静态变量:static关键字可以用于声明静态变量,静态变量存储在静态存储区,在程...
      99+
      2023-09-14
      c语言 static
    • c语言static关键字用法详解
      目录1.static修饰全局变量2.static修饰函数3.static修饰局部变量总结:1.static修饰全局变量 我们创建两个源文件,一个test.c,一个main.c 现在...
      99+
      2022-11-12
    • 详解C语言中的Static关键字
      一、static关键字的基本含义 首先,static关键字的意思是静态的,用于修饰局部变量,全局变量和函数,修改其数据储存类型 1.局部变量:在任意一个函数内部定义的变量(不加sta...
      99+
      2022-11-13
    • C语言中static关键字的作用是什么
      本篇内容介绍了“C语言中static关键字的作用是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!static这个关键字是“静态”的意思,...
      99+
      2023-07-05
    • 全面了解C语言 static 关键字
      目录一,前言二、认识多文件1、多文件的创建2、为什么要有多文件3、为什么要有头文件4、多文件在代码中的具体体现三、最名不符实的关键字 - static1、static 修饰局部变量2...
      99+
      2022-11-13
    • C/C++中static,const,inline三种关键字详细总结
      一、关于staticstatic 是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下面我将从 static 修饰符的产生原因、作用谈起,全面分析static 修饰符的实...
      99+
      2022-11-15
      static inline const
    • C#中const,readonly和static关键字的用法介绍
      如果有一个值不太会变化,我们经常使用const和readonly,这2者有何不同呢?有时候,我们也会在readonly之前加上关键字static,这又意味着什么呢? const co...
      99+
      2022-11-13
    • C语言的static关键字应用实例分析
      这篇文章主要介绍“C语言的static关键字应用实例分析”,在日常操作中,相信很多人在C语言的static关键字应用实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言的static关键字应用实例分析...
      99+
      2023-06-30
    • C#关键字Check怎么使用
      这篇文章主要介绍“C#关键字Check怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#关键字Check怎么使用”文章能帮助大家解决问题。功能描述checked运算符通知运行时当溢出时抛出一...
      99+
      2023-06-29
    • C++ explicit关键字怎么使用
      这篇“C++ explicit关键字怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++ exp...
      99+
      2023-07-05
    • 深度理解C语言中的关键字static
      目录一、函数和变量的多文件问题1.1.为什么全局变量和函数需要跨文件访问二、static修饰变量和函数2.1.static修饰全局变量2.2.static修饰局部变量2.3.为什么局...
      99+
      2022-11-12
    • C语言入门篇--关键字static详解
      目录1.修饰局部变量1.1作用1.2举例(1)不加static(2)加static(3)静态局部变量的初始化只会进行一次2.修饰全局变量2.1作用2.2举例(1)不加static(2...
      99+
      2022-11-12
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作