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

在C中使用"extern"存储类说明符

在C语言中,extern是一个存储类说明符,用于声明外部变量或函数。它告诉编译器,变量或函数的定义在其他源文件中,需要在链接时进行连接。

当使用extern声明一个变量时,不需要再次分配存储空间,只需要告诉编译器变量的类型和名称。例如:

代码语言:c
复制
extern int my_var;

这告诉编译器,my_var是一个整数类型的变量,它的定义在其他源文件中。

当使用extern声明一个函数时,也只需要告诉编译器函数的返回类型、名称和参数列表。例如:

代码语言:c
复制
extern int add(int a, int b);

这告诉编译器,add函数接受两个整数参数并返回一个整数值,它的定义在其他源文件中。

在C语言中,extern关键字的使用非常重要,因为它可以帮助避免重复定义和链接错误。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++ 命名 Mangling 和 externC

不支持函数重载,因此,当我们 C++ 链接 C 代码时,我们必须确保符号的名称不被更改。...从 C++ 链接时如何处理 C 符号? C ,名称可能不会被修改,因为它不支持函数重载。那么当我们 C++ 链接 C 代码时,如何确保符号的名称不被更改。...例如,请参阅以下使用 C 的 printf() 函数的 C++ 程序。 ...解决方案:  C++ ExternC” 当一些代码被放入 externC” 块时,C++ 编译器确保函数名是未修改的——编译器发出一个名称不变的二进制文件,就像 C 编译器会做的那样。...main() { printf("haiyong"); return 0; } 输出 haiyong 因此,所有 C 风格的头文件(stdio.h、string.h 等) extern

1.2K40
  • c++存储

    C++ 存储存储定义 C++ 程序变量/函数的范围(可见性)和生命周期。这些说明符放置它们所修饰的类型之前。...下面列出 C++ 程序可用的存储:autoregisterstaticexternmutablethread_local (C++11)从 C++ 17 开始,auto 关键字不再是 C++ 存储说明符...C++98标准auto关键字用于自动变量的声明,但由于使用极少且多余, C++17 已删除这一用法。...register 存储register 存储用于定义存储寄存器而不是 RAM 的局部变量。...thread_local 存储使用 thread_local 说明符声明的变量仅可在它在其上创建的线程上访问。 变量创建线程时创建,并在销毁线程时销毁。 每个线程都有其自己的变量副本。

    70520

    C】Storage Class

    什么是Storage Class Storage Class翻译成中文为存储(总感觉翻译成汉语不太好),用来修饰C变量和函数。如果没有显式的指定storage class,会使用默认值。...auto register static extern typedef 需要注意的是我们一个声明,我们至多使用一个storage class的说明符。...如果没有显示使用说明符,则会使用以下的默认规则: 函数内部声明的变量默认使用 auto 说明符 函数内部声明的函数默认使用 extern 说明符 函数外部声明的变量和函数默认使用static说明符...Storage Class 类别(Type) 根据上面所说,C中一共有四storage class: Automatic Storage Class Register Storage Class Static...如果想在文件A中使用文件B的变量i,那么就需要在A中使用extern声明i,下面是一个例子: A.c #include extern int i; int main() {

    78000

    C++fstream_使用

    C++处理文件类似于处理标准输入和标准输出。ifstream、ofstream和fstream分别从 istream、ostream和iostream派生而来。...作为派生的,它们继承了插入和提取运算符(以及其他成员函数),还有与文件一起使用的成员和构造函数。可将文件 包括进来以使用任何fstream。...如果只执行输入,使用ifstream;如果只执行输出,使用 ofstream;如果要对流执行输入和输出,使用fstream。可以将文件名称用作构造函数参数。...被打开的文件程序由一个流对象(stream object)来表示 (这些的一个实例) ,而对这个流对象所做的任何输入输出操作实际就是对该文件所做的操作。...http://www.cplusplus.com/reference/fstream/fstream/列出了fstream可以使用的成员函数。

    5.5K10

    Android开发怎样使用Application

    ---- Android开发怎样使用Application ---- 自己独立开发项目才发现以前对Application并不是十分了解,现在开始直接搭建一个新项目的框架才重新踩过这个坑。...Application项目开发使用 首先在项目目录下一个Java继承Application,实现是onCreate()方法。...控件的构造方法获取Context或者做其他视图操作 写过Android的同学应该知道自己或者看别人dome都很少或者基本看不到控件构造函数内进行初始化,获取参数等这些操作吧!...具体原因是ContextWrapper的源码,他有一个attachBaseContext()方法,这个方法会将传入的一个Context参数赋值给mBase对象,之后mBase对象就有值了。...而我们又知道,所有Context的方法都是调用这个mBase对象的同名方法,那么也就是说如果在mBase对象还没赋值的情况下就去调用Context的任何一个方法时,就会出现空指针异常,上面的代码就是这种情况

    2.2K50

    Android开发怎样使用Application(二)

    接着上次总结的Application的实际项目使用Android开发怎样使用Application,最近我又发现了一个取巧的使用方法,给想要快速开发的同学分享下心得,也是给大家多提供一个思路吧。...统一全局的Dialog样式,你就可以在这个帮助获取App的当前Activity实例来显示Dialog. 2、工具中用static关键字引入Application实例的单例对象 这个才是今天我主要想说的...,import通过static关键字引入Application实例,工具和帮助的大量方法中就不用大量依赖Context做传入处理了。...第二种方法当然设计模式上有耦合度很高的缺点,导致这些工具都要依赖App,但是Android开发,这个你可以封装一个BaseApplication的Application的基础来,让其他的Application...由于笔者感觉理论上完全可以,而且是真的方便,但是毕竟我也还是用这个思路试用阶段,没有经过大量的项目实践检验,所有大家如果用这种方法遇到坑请给我留言注意一下。

    1.5K20

    Dart 更好地使用和 mixin

    Dart 是一门“纯”面向对象的编程语言,其中所有的对象都是的实例。但是 Dart 并不要求所有代码都定义一个。我们可以一个的外面定义顶级变量、常量、函数 —— 就像面向过程语言那样。...但是, Dart ,如果仅仅是一个函数,定义反而使得代码不好维护。这个时候建议直接使用 typedef 来定义函数别名。...,那么直接定义顶级的常量和函数来替换这种方式 Java 或 C#,如果要定义常量的话通常需要定义一个静态常量来做,例如: // Java 代码 public class ConstParams {...这个很多语言都有介绍过,继承应该仅在子类符合“is a”父的关系的时候才使用。...建议4:不要使用 implements 实现非接口 接口的定义的好处是可以多种实现方式中切换而无需更改代码,依赖注入型的框架或代码结构中会经常使用面向接口编程的方式。

    2.4K00

    C++ const各种用法总结

    要使const变量能够在其他的文件访问,必须显式地指定它为extern。...+中标准的强制转换,C语言使用:double *ptr = (double*)&dVal; 2.const 指针(指针本身为常量) 声明或定义的格式如下(定义时必须初始化): *const...[*注意*]但这只对于内部类型而言(因为内部类型返回的肯定是一个值,而不会返回一个变量,不会作为左值使用,否则编译器会报错),对于用户自定义类型,返回值是常量是非常重要的(后面里面会谈到)。...,而不是一般的对象实例,原因同上; 4.const成员函数的三种用法(参数、返回值、函数)要很好的使用; 5.不要轻易的将函数的返回值类型定为const; 6.除了重载操作符外一般不要将返回值类型定为对某个对象的...编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

    1.9K10

    C++变量的存储说明符和cv-限定符

    C++创建变量时,前面有时会有一些修饰符,这里总结一下。 大体分为两个类别:存储说明符和cv-限定符。...存储说明符 存储说明符有下面这些: auto register static extern mutable auto修饰符的变量时自动变量,如果变量没有任何修饰符,默认就是自动变量,其作用域函数内部。...register修饰变量将创建一个寄存器变量,理念在于CPU访问寄存器的值比访问普通存储堆栈的值速度要快,声明方法: register int count_fast; 需要注意的是,编译器并不一定会满足将变量放在寄存器的要求...要注意静态变量使用范围: int global = 1000;// 函数外声明,文件内外皆可使用 // 此时如果其他文件还想创建global同名变量,要么用extern声明(此时用的还是同一个,共享了变量...因为假设编译器发现程序几条语句中都使用了某个变量,那么为了优化,它不会让程序去查多次,而是缓存到寄存器

    61110

    C++的作用域与生命周期

    C++作用域的级别主要有文件域(全局作用域)、命名空间域、域、函数作用域和代码块作用域(局部域)。 2.函数的作用域 函数分为的成员函数和全局函数。 的成员函数: - 作用域:域。...- 注意:成员函数可以定义体内,即定义头文件,当被不同源文件包含时不会报重定义的错误,因为作用域被限制。...全局变量: - 作用域:全局作用域(全局变量只需一个源文件定义,就可以作用于所有的源文件); - 生命周期:程序运行期一直存在; - 引用方法:其他文件使用必须用extern 关键字声明要引用的全局变量...举例如下: void function() { static int iREFCounter = 0; } 5.扩展知识点 1.变量存储说明符 C语言中提供了存储说明符auto...四种存储类别说明符有两种存储期:自动存储期和静态存储期。其中auto和register对应自动存储期。具有自动存储期的变量进入声明该变量的程序块是被建立,它在该程序块活动时存在,退出该程序块时撤销。

    1.1K20
    领券