extern和volatile的用法

2023-05-16

extern 的用法


extern的用法的对象主要是变量和函数。  

用extern声明外部变量

①什么是外部变量
外部变量是指在文件或者函数外部定义的全局变量。外部变量仅定义一次并且在所有的函数之外。
②在一个文件内使用外部变量
作用域:如果在定义变量之前就使用了 外部变量就要用extern进行声明,在声明外部变量时,类型名是可以省略不写的。看一个从网上找的例子:
#include <stdio.h>
int max(int x,int y);     
int main(int argc,char *argv[ ] )
{
        int result;
      extern int X; 	//外部变量声明
       extern int Y;
        result = max(X,Y);
        printf("the max value is %d\n",result);
        return 0;
}
int X = 10;            //定义外部变量
int Y = 20;
int max(int x, int y)
{
        return (x>y ? x : y);
}
③在多个文件中使用外部变量
多文件使用外部变量通常使用在一个工程中有多个源文件的时候。在一个工程中往往会出现这种情况,就是在一个源文件A中定义的全局变量要被用到另一个源文件B中,这时就不能在源文件B中再次定义和源文件A中相同的变量。如果这样编译器则会出现重定义的错误,因此要在源文件B中用到已经定义的变量就必须用extern声明此变量。因为一个全局变量只可能被定义一次,但可以被声明多次。用一个网上找的例子来说明:
#include <stdio.h>
int BASE=2;				//变量定义
int exe(int x);  			//外部函数提前声明
int main(int argc, char *agrv[])
{
        int a=10;
        printf("%d^%d = %d\n",BASE,a,exe(a));
        return 0;
}
	文件b.c的内容:
#include <stdio.h>
extern int BASE;				//外部变量声明
int exe(int x)
{
        int i;
        int ret=1;
        for(i=0;i<x;i++)
        {
                ret*=BASE;
        }
        return ret;
}
这种情况只是在一个文件中被声明,其实还可以同时在另一个文件中声明。

用extern声明外部函数

①定义函数时,在函数返回类型的前面加上extern,表示此函数是外部函数,可以 供其他文件调用使用。例如:

extern int func (int x,int y),此时extren可以省略隐形为外部函数。当其他文件调用此文件函数是使用extern进行声明且extern可以省略。这时被调用的函数的作用域被扩展。例子:

#include <stdio.h>
#include "b.h"
int main()
{
        int x=10,y=5;
        printf("x = 10,y = 5\n");
        printf("x + y = %d\n",add(x,y));
        printf("x - y = %d\n",sub(x,y));
        printf("x * y = %d\n",mult(x,y));
        printf("x / y = %d\n",div(x,y));
        return 0;
}
文件b.h的内容:
#ifndef __F_H
#define __F_H
extern int add(int x,int y);
extern int sub(int x,int y);
extern int mult(int x,int y);
extern int div(int x,int y);
 #endif
文件b.c的内容:
#include <stdio.h>
int add(int x,int y)
{
        return(x+y);
}
int sub(int x,int y)
{
        return(x-y);
}
int mult(int x,int y)
{
        return(x*y);
}
int div(int x,int y)
{
        if(y!=0)
        {
                return(x/y);
        }
        printf("mult() fail!the second para can not be zero!\n ");
        return(-1);
}

从程序中能得到,在b.h文件中声明好了b.c的函数,如果要使用此文件中的函数,只需将b.c包含到被需要的文件中即可,这样就可以使用b.c的接口函数了。在工程中经常采用这种方法,在.C文件中写函数的实现,在.h文件中声明函数接口,当需要使用.C文件中的函数时,只需要将.h文件包含进来就可以了。


volatile的用法

①volatile是一个修饰符,用来修饰不同线程修改和访问的变量。如果没有它,则根本无法编写多线程的程序或者编译器失去大量优化的机会。例子:

volatile int i=10; 
int j = i; 
... 
int k = i; 

volatile告诉编译器i随时可能发生变化,当使用它的时候要小心,必须从它的地址中读取数据。因此k中的值是从i的地址中读取出来的。

一个被定义为volatile的变量是说这个变量很可能会被意想不到的改变。就是说,当优化器在用到这个变量时,必须从该变量的地址中读取这个变量的数据,而不是使用保存在寄存器中的备份。



          

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

extern和volatile的用法 的相关文章

  • Objective-C 中的全局变量 - extern 和 .m 文件顶部声明的差异

    我知道你可以使用 extern 在 Objective C 中定义一个全局变量 但我刚刚意识到我在第一个方法之前在 m 文件顶部声明的变量也意外地是全局的 这导致了一些问题 问题 我将它们移至头文件的 interface 部分 我认为这正确
  • “快速路径”无竞争同步是什么意思?

    来自性能和可扩展性的章节JCIP书籍 http jcip net s3 website us east 1 amazonaws com 同步机制针对无竞争的情况进行了优化 case 易失性始终是无争议的 在撰写本文时 快速路径 无竞争同步范
  • CDI PostConstruct 和易失性字段

    当我们想要有条件地初始化 bean 的某些字段时 使用后构造方法 我们是否需要关心字段的波动性 因为它是多线程环境 比如说 我们有这样的东西 ApplicationScoped public class FooService private
  • EventWaitHandle 是否有任何隐式 MemoryBarrier?

    我是这个网站的新手 所以如果我没有以可接受的方式发帖 请告诉我 我经常按照下面的示例编写一些代码 为了清楚起见 省略了诸如 Dispose 之类的内容 我的问题是 是否需要如图所示的挥发物 或者 ManualResetEvent Set 是
  • 多线程中 volatile 变量的值不会改变

    我有一个在后台运行的 winform 应用程序BackgroundWorker它有一个无限循环 每小时执行一些事情 我的用户界面Form类是这样的 public partial class frmAutoScript Form privat
  • 通过 mmap 文件进行 IPC:应该使用原子和/或易失性吗?

    我使用 mmap 文件在进程之间共享数据 代码是这样的 struct Shared int Data int file open file dat O RDWR Shared shared static cast
  • 在定义中使用 static 关键字与在 C 中使用声明

    以下编译良好 使用static仅在函数声明期间 include
  • Linux内核中读写原子操作的实现

    最近 我研究了 Linux 内核的原子读写实现 并提出了一些问题 首先是ia64架构的相关代码 typedef struct int counter atomic t define atomic read v volatile int v
  • java 数组列表上的易失性/同步

    我的程序如下所示 public class Main private static ArrayList
  • 对 Volatile.Read/Write 的理解

    我试图理解 C Volatile 类 正如我读到的 The Volatile Write方法强制写入位置中的值 到呼叫点 此外 任何较早的程序订单 加载和存储必须在调用 Volatile Write 之前发生 The Volatile Re
  • C 易失性变量和高速缓存

    缓存是由缓存硬件对处理器透明地控制的 因此如果我们在C程序中使用易失性变量 如何保证我的程序每次都从指定的实际内存地址读取数据而不是缓存 我的理解是 Volatile 关键字告诉编译器不应优化变量引用 而应按照代码中的编程方式读取变量引用
  • 时间:2019-03-14 标签:c++

    我正在编写一个 C 应用程序 我有一个类变量 多个线程正在写入该变量 在 C 中 任何可以在编译器 意识到 正在更改的情况下进行修改的内容都需要标记为易失性 对吧 因此 如果我的代码是多线程的 并且一个线程可能写入 var 而另一个线程从中
  • 静态类变量与外部变量相同,只是具有类作用域吗?

    在我看来 静态类变量与外部变量相同 因为你只需要declare它在static int x extern int x语句 并在其他地方实际定义它 通常在 cpp 文件中 静态类变量 h file class Foo static int x
  • C#:shlwapi.dll 中 StrCmpLogicalW 的实现或替代

    为了在我的应用程序中进行自然排序 我当前在 shlwapi dll 中 P Invoke 一个名为 StrCmpLogicalW 的函数 我正在考虑尝试在 Mono 下运行我的应用程序 但当然我不能拥有这个 P Invoke 东西 据我所知
  • 使闭包捕获的变量变得易失性

    闭包捕获的变量如何与不同线程交互 在下面的示例代码中 我想将totalEvents 声明为易失性的 但C 不允许这样做 是的 我知道这是错误的代码 这只是一个例子 private void WaitFor10Events volatile
  • 易失性结构=结构不可能,为什么?

    struct FOO int a int b int c volatile struct FOO foo int main void foo a 10 foo b 10 foo c 10 struct FOO test foo return
  • 何时在多线程中使用 易失性?

    如果有两个线程访问全局变量 那么许多教程都说使该变量成为易失性的 以防止编译器将变量缓存在寄存器中 从而无法正确更新 然而 两个线程都访问共享变量需要通过互斥体进行保护 不是吗 但在这种情况下 在线程锁定和释放互斥体之间 代码位于关键部分
  • 为什么将 volatile 与同步块一起使用?

    我在java中看到了一些示例 其中他们在代码块上进行同步以更改某些变量 而该变量最初被声明为易失性 我在单例类的示例中看到 他们将唯一实例声明为易失性 并且同步了该块初始化该实例 我的问题是为什么我们在同步它时声明它是易失性的 为什么我们需
  • 原始类型是易失性的还是同步的?

    在 Java 中 如果变量的大小小于或等于 32 位 则赋值是原子的 但如果变量的大小大于 32 位 则赋值不是原子的 在双重或长分配的情况下 使用什么 易失性 同步 会更有效 Like volatile double x y 同步不适用于
  • 块作用域链接 C 标准

    以下标识符没有链接 声明为对象或函数之外的任何标识符 声明为函数参数的标识符 未使用存储类说明符 extern 声明的对象的块作用域标识符 static int a no linkage 对于在该标识符的先前声明可见的范围内使用存储类说明符

随机推荐

  • 软件工程基础 - 九种开发模型

    瀑布模型 xff08 Waterfall Model xff09 xff1a 瀑布模型的示意图 瀑布模型适合应用的项目类型 xff1a 需求明确 或者 二次开发 瀑布模型是结构化方法中的模型 xff0c 一般应用于结构化的开发 原型模型 x
  • 用js控制输入框input数字、汉字、字符与正则表达式

    案例 xff1a span class token comment 验证是否为数字 包含小数点个数 不能 xff10 开头 span span class token keyword function span span class tok
  • centos6.5安装xrdp

    近来工作比较无聊 xff0c 折腾了个CentOS6 5玩玩 XRDP的功能是在windows系统中使用mstsc远程桌面连接Linux进行操作 由于上次折腾忘记了XRDP的配置步骤 xff0c 特此记录一下 1 安装源 rpm ivh h
  • Ubuntu20.04安装anaconda

    1 下载anaconda 官网链接 xff1a Anaconda Anaconda Distribution 直接选择Download xff0c 他会自动识别系统下载最新的版本 2 安装anaconda 进入下载文件夹 xff0c 运行安
  • 终于有人把SDH、MSTP、OTN和PTN的关系解释清楚了

    在开始之前 xff0c 先要解释一下TDM的概念 TDM xff0c 就是时分复用 xff0c 就是将一个标准时长 xff08 1秒 xff09 分成若干段小的时间段 xff08 8000 xff09 xff0c 每一个小时间段 xff08
  • 使用Visual Studio 2022运行C++代码

    使用Visual Studio 2022运行C 43 43 代码 1 打开VS 2022 xff0c 创建新项目 2 安装多个工具和功能 3 选中 使用C 43 43 的桌面开发 和 通用Windows平台开发 xff0c 点击修改 xff
  • Windows远程麒麟桌面操作系统、相互远程桌面的设置方法(一)

    前言 VNC Virtual Network Computing 是进行远程桌面控制的一个软件 客户端的键 盘输入和鼠标操作通过网络传输到远程服务器 xff0c 控制服务器的操作 服务器的图形 界面通过网络传输到客户端显示给用户 就像直接在
  • shell 中bad substitution错误

    今天在学习linux写shell脚本的时候 xff0c 碰到了一个bad substitution错误 脚本的内容是输入一个文件名 xff0c 创建出三个文件名 43 日期 xff08 今天 xff0c 昨天 xff0c 前天 xff09
  • 关于自增自减的理解

    自增运算符 43 43 xff1a 自增运算符 xff0c 也是一元运算符 作用 xff1a 与变量配合使用 xff0c 使得变量加一或减一 前置自增 xff1a 自增运算符在变量的前面 后置自增 自增运算符在变量的后面 前置自增和后置自增
  • CentOS安装NodeJS

    CentOS安装NodeJS 在CentOS下安装NodeJS有以下几种方法 使用的CentOS版本为7 2 CentOS其他版本的NodeJS安装大同小异 xff0c 也可以参看本文的方法 安装方法1 直接部署 1 首先安装wget yu
  • 无法打开“windows.h”文件、无法打开“kernel32.lib”文件解决方法

    无法打开 windows h 文件的解决做法 xff1a 在VS2008下的option VC 43 43 目录 添加包含文件路径中 xff0c 添加windows SDK目录 xff0c 例如这个 xff0c C Program File
  • ubuntu 搜索安装包的命令

    1 sudo apt cache search XXX
  • ubuntu让开机就打开蓝牙

    我的ubuntu默认就有蓝牙功能 xff0c 也可以用 xff0c 但每次重启就很要重新打开蓝牙 xff0c 很烦恼 xff0c 解决办法如下 xff1a 1 sudo apt get install blueman bluez 2 vim
  • 【百度OCR】java调用百度OCR接口实现文字识别

    百度智能云文字识别 https ai baidu com 创建应用 参考博客 xff1a Java基于百度API接口实现智慧文字识别 百度AI开放平台 xff0c 文字识别接口 获取access token 百度AI 对接百度AI 增值税发
  • 使用某个用户登录命令:kinit adminad

    使用某个用户登录命令 xff1a kinit admin admin 票据生成方法 xff1a hdfs 票据 su hdfs klist hdfs rdspproduction 64 CARS COM 票据 然后切换到155机器 执行 s
  • Python3+Selenium框架搭建

    Webdriver概述 Webdriver Selenium2 xff09 是一种用于Web应用程序的自动测试工具 xff0c Thoughtworks公司一个强大的基于浏览器的开源自动化测试工具 xff0c 通常用来编写web应用的自动化
  • 算法题1:字符序列交换(阿里巴巴笔试题)

    题目 xff1a 若初始序列为gbfcdae xff0c 那么至少需要多少次两两交换 xff0c 才能使该序列变为abcdefg xff1f 任给一个自由a g这7个字母组成的排列 xff0c 最坏的情况下需要至少多少次两两交换 xff0c
  • 写给前端的 Nest.js 教程——10分钟上手后端接口开发

    前言 这个教程的所有代码我都放在了我的 GitHub 仓库 xff1a Nest CRUD Demo 1 xff0c 欢迎大家点个 Star xff01 框架简介 Nest 是一个用于构建高效 xff0c 可扩展的 Node js 服务器端
  • NSPredicate谓词搜索使用小记

    iOS中的搜索正常情况下用NSPredicate都足以解决问题 比如我们有一个原数组 dataArraty NSPredicate predicate 61 NSPredicate predicateWithFormat 64 span c
  • extern和volatile的用法

    extern 的用法 extern的用法的对象主要是变量和函数 用extern声明外部变量 什么是外部变量 外部变量是指在文件或者函数外部定义的全局变量 外部变量仅定义一次并且在所有的函数之外 在一个文件内使用外部变量 作用域 xff1a