在 C 语言中,外部存储类说明符的重要性和用法
In C, importance and usage of extern storage class specifier
可能的重复项:
什么是外联和内联C++
其实我想知道extern
的重要性。
首先我写了一些代码:
文件1.h
extern int i;
文件2.c
#include<stdio.h>
#include "file1.h"
int i=20;
int main()
{
printf("%d",i);
return 0;
}
现在我的问题是:当我必须在file2.c
中定义i
时,extern变量有什么用,在file1.h
中声明对我有用。
苏丹书
extern
允许您声明一个变量(通知编译器它的存在),而无需定义它(使其存在)。一般规则是,您可以根据需要多次声明事物,但只能定义一次。
例如,如果要在其他地方定义它,这将很有用。
考虑:
file1.c: file2.c:
extern int xyzzy; int xyzzy;
void fn (void) {
xyzzy = 42;
}
当你将这两个函数链接在一起时,将有一个xyzzy
,即file2.c
中定义的那个,这就是fn
将要改变的那个。
现在即使没有extern
也会发生这种情况.extern
所做的是声明xyzzy
存在以file1.c
,这样您就不会收到任何I don't know what the blazes "xyzzy" is
错误。
在您的特定情况下(如果这是您唯一的两个文件),则不需要它。仅当您有另一个#include
d file1.h
并尝试访问i
的文件时才需要它。
当您有三个文件时,它很有用:
福.H
extern int i;
void bar();
交流:
#include "foo.h"
int i = 6;
int main(){
bar();
}
公元前:
#include "foo.h"
void bar(){
printf("%dn", i);
}
如您所见,i
在a.c
和b.c
之间共享,而不是像没有extern
关键字时那样按文件重新定义。
C 中的 "extern" 声明表示全局变量的存在及其类型。
在C语言中,大多数.c文件的行为就像一个单独的模块。因此,带有"extern"的变量是在当前模块外部定义的东西。
在一个地方定义全局,然后在所有其他地方声明对它的外部引用总是更好的做法。当引用任何共享库提供的全局变量时,这对于确保您的代码引用变量的正确且通用的实例非常重要。
来自维基百科:
定义变量时,编译器会为其分配内存 变量,也可能将其内容初始化为某个值。 声明变量时,编译器要求该变量 在别处定义。该声明通知编译器 存在具有该名称和类型的变量,但编译器不需要 为它分配内存,因为它是在其他地方分配的。
Extern 是一种显式声明变量或强制 没有定义的声明
如果在文件 1 中定义了变量,以便使用相同的变量 变量,则必须声明它。无论 文件数,此变量仅定义一次,但是,它必须 在包含定义的文件之外的任何文件中声明。
如果程序位于多个源文件中,并且定义了变量 在文件 1 中并在文件 2 和文件3 中使用,则外部声明是 在 File2 和 File3 中需要连接变量的出现次数。
extern告诉编译器它是一个变量的声明。
在 file1.h 的示例中,想象一下如果您不指定 extern 关键字会发生什么。看起来int i有两个定义。此外,头文件可以包含在许多 .c 文件中。如果编译这些 .c 文件并链接它们,链接器将看到同一变量的多个定义。
extern 关键字允许您对编译器说..." 立即使用此变量。我稍后将定义并初始化它"..即" 立即编译.我稍后将链接到其定义"。
当您在其他文件中定义变量并希望在当前上下文中使用它时,您可以 extern
中的声明允许您从多个源文件访问变量,同时仍然只在一个位置定义它。
- 激励'inline'说明符的真实世界示例?
- 缺少类型说明符,显式类型为"缺少错误"
- 为什么mpfr_printf与十六进制浮点(%a转换说明符)的printf不同
- 叮叮当当在修复时插入多个"覆盖"说明符
- 编译器错误:destuctor 的更宽松的抛出说明符
- 使用说明符 extern 声明的C++中的标识符链接
- 同时具有"外部"和"内联"说明符的变量
- 与 tesseract::TessBaseApi() 相关的 Tesseract-OCR 出错(预期的类型说明符)
- 错误:不能使用"显式"说明符声明 bool'
- 基于范围的 for 循环range_declaration中各种说明符之间的性能差异
- 为什么转换函数声明不需要至少一个定义类型说明符
- NOEXCEPT 函数调用运算符的说明符_Not_fn
- 参数包内 noexcept 说明符
- C++需要所有声明的类型说明符和预期的非限定 id(需要调试帮助)
- 格式说明符C++有什么问题
- 0x%08lx 格式说明符在 printf 语句到 cout
- 私钥解密代码使用公共接口说明符到 BSAFE 库 v6.0?
- 在 CRTP 中使用嵌套名称说明符
- 函数模板签名中忽略的成员类型def 的访问说明符
- 在 C 语言中,外部存储类说明符的重要性和用法