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

无法一起使用extern和static存储类说明符

在C语言中,externstatic是两种不同的存储类说明符,它们分别具有不同的作用和用途。

extern是一个链接类型说明符,用于声明外部变量或函数。当在一个源文件中使用extern声明一个变量或函数时,它告诉编译器该变量或函数的定义在其他源文件中,并且在链接阶段需要找到这个定义。如果没有找到定义,编译器会报错。

static是一个存储类说明符,用于声明静态变量或函数。静态变量和函数的作用域仅限于定义它们的源文件,在其他源文件中无法访问。此外,静态变量在程序运行期间只会被初始化一次,并且在程序运行期间一直保持其值,直到程序结束。

因此,externstatic存储类说明符不能一起使用,因为它们的作用和用途相互矛盾。如果在同一个变量或函数声明中同时使用externstatic,编译器会报错。

如果需要在多个源文件中共享一个变量或函数,可以在一个源文件中定义它,并在其他源文件中使用extern声明。如果只需要在当前源文件中使用一个变量或函数,可以使用static存储类说明符。

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

相关·内容

iOS小技能: staticextern 存储的应用(创建共享实例、申明公共方法、全局字符串常量)

引言 在 C 语言中,程序内变量或函数的作用域寿命是由其存储确定的,比如staticextern。...当 static 使得一个特定的文件中的函数变量全局可见,extern 则使它们对所有文件可见。...使用extern申明公共方法、全局字符串常量 I 使用static结合线程安全模式来创建共享实例 单例对象应该使用线程安全模式来创建共享实例。...// 解决方法:static 修饰的全局变量,这样其他无法引用 解决办法:使用static进行修饰,作用域仅限于当前的文件。...当 static 使得一个特定的文件中的函数变量全局可见,extern 则使它们对所有文件可见。

89330
  • c++存储

    C++ 存储存储定义 C++ 程序中变量/函数的范围(可见性)生命周期。这些说明符放置在它们所修饰的类型之前。...static 存储static 存储指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入离开作用域时进行创建和销毁。...当您使用 'extern' 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。...thread_local 存储使用 thread_local 说明符声明的变量仅可在它在其上创建的线程上访问。 变量在创建线程时创建,并在销毁线程时销毁。 每个线程都有其自己的变量副本。...thread_local 说明符可以与 staticextern 合并。可以将 thread_local 仅应用于数据声明定义,thread_local 不能用于函数声明或定义。

    71020

    【C】Storage Class

    什么是Storage Class Storage Class翻译成中文为存储(总感觉翻译成汉语不太好),用来修饰C中变量函数。如果没有显式的指定storage class,会使用默认值。...auto register static extern typedef 需要注意的是我们在一个声明中,我们至多使用一个storage class的说明符。...如果没有显示使用说明符,则会使用以下的默认规则: 在函数内部声明的变量默认使用 auto 说明符 在函数内部声明的函数默认使用 extern 说明符 在函数外部声明的变量函数默认使用static说明符...对于全局变量或者函数来说,如果不加static说明符,那么变量或者函数就可以被程序中的所有文件使用,而extern就是实现这一功能的关键。...对于函数声明(不是定义)来说,其默认storage class说明符就是extern,即void a();extern void a();是等同的。

    79700

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

    C++中作用域的级别主要有文件域(全局作用域)、命名空间域、域、函数作用域代码块作用域(局部域)。 2.函数的作用域 函数分为的成员函数全局函数。 的成员函数: - 作用域:域。...举例如下: void function() { static int iREFCounter = 0; } 5.扩展知识点 1.变量存储说明符 C语言中提供了存储说明符auto...,register,externstatic说明的四种存储类别。...四种存储类别说明符有两种存储期:自动存储期和静态存储期。其中autoregister对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块是被建立,它在该程序块活动时存在,退出该程序块时撤销。...,那么,我们一定要避免函数中使用static变量这样的函数被称为:带“内部存储器”功能的的函数; (5)函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值

    1.1K20

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

    大体分为两个类别:存储说明符cv-限定符。...存储说明符 存储说明符有下面这些: auto register static extern mutable auto修饰符的变量时自动变量,如果变量没有任何修饰符,默认就是自动变量,其作用域在函数内部。...要注意静态变量使用范围: int global = 1000;// 在函数外声明,文件内外皆可使用 // 此时如果其他文件还想创建global同名变量,要么用extern声明(此时用的还是同一个,共享了变量...),要么用static声明来隐藏这个大全局global(此时是新的变量) static int one_file = 50;// 在函数外使用static声明,只在文件内各个函数可使用 void func...修饰的变量表示引用声明,假设文件1声明了一个外部变量,文件2要使用它,必须使用extern来修饰,因为不能创建两个同名的外部变量,如上文所述。

    62110

    C++中变量声明与定义的规则

    其中声明规定了变量的类型名字,定义除此功能外还会申请存储空间并可能为变量赋一个初始值。...定义i, 这样做抵消了extern的作用 static 当我们在C/C++用static修饰变量或函数时,主要有三种用途: 局部静态变量 外部静态变量/函数 内静态数据成员/成员函数 其中第三种只有...总结 static这个说明符在不同地方所起的作用域是不同的,比如把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期,把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。...顶层const用于表示任意的对象是常量,包括算数类型、指针等,底层const用于表示引用指针等复合类型的基本类型部分是否是常量。...字面值是常量表达式 算术类型、引用指针都属于字面值类型,自定义则不属于字面值类型,因此也无法被定义为constexpr。

    2.3K10

    C++基础变量

    变量 变量的基本形式是:首先是类型说明符,随后紧跟有一个或者多个的变量名组成的列表,其中含有多个变量名时用逗号隔开,最后以分号结束。...string &rName = "test1";// 错误 一般在初始化的时候,初始化值会被拷贝到新建的对象中,引用对象被引用对象的的初始化在一起,而不是拷贝一个新的初始化给引用,也就是引用是被引用对象共用一块内存地址...解决的办法就是在const变量不管在声明还是在定义都需要加上关键字extern. extern const int buffSize = 1024 // 在file_1.cpp 初始化一个常量 extern...const int buffSize // 在file_1.h 只能够定义常量 static静态成员 静态数据成员在定义或说明时前面加关键字static。...静态数据成员初始化的格式如下: ::=

    38010

    C++ const各种用法总结

    ] const = ; [2] [1][2]的定义是完全等价的。...(只有extern 位于函数外部时,才可以含有初始化式) 二 数组及结构体 声明或定义的格式如下: const []…… [1] const ...> * …… [1] const * …… [2] [1][2]的定义是完全等价的。...[*注意*]但这只对于内部类型而言(因为内部类型返回的肯定是一个值,而不会返回一个变量,不会作为左值使用,否则编译器会报错),对于用户自定义类型,返回值是常量是非常重要的(后面在里面会谈到)。...编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

    2K10

    存储类别、链接内存管理(二)

    默认情况下,声明在块或函数头中的任何变量都属于自动存储类别。使用auto作为存储类别说明符。 再复习一下: 无链接意味着这些变量属于定义它们的块、函数或原型私有。...二、寄存器变量 在函数头中使用关键字register,便可请求寄存器变量。 它们都是块作用域、无链接自动存储期。...也就是说,这种变量具有块作用域、无链接,但是具有静态存储期。计算机在多次函数调用之间会记录它们的值。在块中(提供块作用域无链接)以存储类别说明符static(提供静态存储期)声明这种变量。...当然,为了指出该函数使用了外部 变量,可以在函数中用关键字extern再次声明。 units具有文件作用域、外部链接和静态存储期。所以即使我们在main函数里没有声明uints,程序一样可行。...五、内部链接的静态变量 该存储类别的变量具有静态存储期、文件作用域内部链接。

    51320

    利用Clang探究__block的本质

    补充 __block 不同于 __strong __weak,后面两个是所有权说明符,而__block是存储说明符,该说明符会影响变量的存储域 常见的存储说明符还有: typedef extern...static auto register auto表示修饰的变量作为局部变量存储在栈中,这是函数或方法内部默认的声明方式,一般不用添加。...等价于int num = 0 而static表示修饰的变量作为静态变量存储在全局变量区。 static变量有默认的初始值0,而auto变量没有默认的初始值。...extern修饰的全局变量,也是存储在全局变量区,虽然都是存储在全局变量区,但是externstatic还是有很大区别的:extern表示修饰的全局变量默认是有外部链接的,作用域是整个工程。...在一个文件内定义的全局变量,在另一个文件中,通过extern声明全局变量,就可以使用全局变量;static修饰的全局静态变量,作用域是声明此变量所在的文件。

    7.3K20

    C语言符号意思(看了必懂系列)「建议收藏」

    auto :声明自动变量 一般不使用 double :声明双精度变量或函数 int: 声明整型变量或函数 struct:声明结构体变量或函数 break:跳出当前循环 else :条件语句否定分支...5.赋值运算符 用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,=,/=,%=) 复合位运算赋值(&=,|=,^=,>>=,<<=)三共十一种。...在C语言中,对变量的存储类型说明有以下四种: auto 自动变量 register 寄存器变量 extern 外部变量 static 静态变量 自动变量寄存器变量属于动态存储方式, 外部变量和静态变量属于静态存储方式...因此变量说明的完整形式应为: 存储类型说明符 数据类型说明符 变量名,变量名…; 例如: static int a,b; 说明a,b为静态类型变量 auto char c1,c2; 说明c1,c2为自动字符变量...static int a[5]={1,2,3,4,5}; 说明a为静整型数组 extern int x,y; 说明x,y为外部整型变量 与指针有关的各种说明意义见下表。

    2.6K20

    CCPP中的auto关键字对比分析

    引入 auto是C语言的一个关键字,关键字主要用于声明变量的生存期为自动,即将不在任何、结构、枚举、联合函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。...C语言中提供了存储说明符auto,register,externstatic说明的四种存储类别。四种存储类别说明符有两种存储期:自动存储期和静态存储期。其中autoregister对应自动存储期。...在C语言中使用auto关键字声明一个变量为自动变量,是C语言中应用最广泛的一种类型,在函数内定义变量时,如果没有被声明为其他类型的变量都是自动变量,也就是说,省去类型说明符auto的都是自动变量。...这里的其他类型指的是变量的存储类型即:静态类型变量(static )、寄存器类型变量(register)外部类型变量(extern)。...自动变量,在函数调用时分配存储空间,当完成调用是释放存储空间。

    87520

    江哥带你玩转C语言 | 15- 修饰符预处理指令

    , 并且不和其他文件中同名全局变量共享同一块存储空间, 那么就可以使用static // A文件中的代码 int num; // B文件中的num共享 void test(){ printf(...#include int main() { extern int num; num = 998; // 使用时并没有存储空间可用, 所以声明了也没用 int...printf("num = %i\n", num); return 0; } int num; // 全局变量, 程序启动就会分配存储空间 ---- staticextern对函数的作用...; } 注意点: 由于默认情况下所有的函数都是外部函数, 所以extern一般会省略 如果只有函数声明添加了staticextern, 而定义中没有添加staticextern, 那么无效 ----...所以带参数的宏比函数具有更高的执行效率 typedef#define的区别 用宏定义表示数据类型用typedef定义数据说明符的区别。

    1.1K00

    c语言全局变量和局部变量问题汇总

    静态全程变量 Turbo C2.0同意将大型程序分成若干独立模块文件分别编译, 然后将全部模块的目标文件连接在一起, 从而提高编译速度, 同一时候也便于软件的管理维护。...extern extern称为外部变量。为了使变量除了在定义它的源文件里能够使用外, 还要被其他文件使用。...不同堆分配的内存无法互相操作。栈空间分静态分配动态分配两种。静态分配是编译器完毕的,比方自己主动变量(auto)的分配。动态分配由alloca函数完毕。...由此看来, 一个变量可由static进行再说明,并改变其原有的存储方式。   1. 静态局部变量   在局部变量的说明前再加上static说明符就构成静态局部变量。   ...在过程内部用 Static keyword声明一个或多个变量,其使用方法 Dim 语句全然一样:   Static Depth   比如,以下的函数将存储在静态变量 Accumulate 中的曾经的运营总值与一个新值相加

    85720
    领券