extern关键字

extern关键字在C/C++中用于声明变量或函数在其他模块中定义,它不分配空间,仅作声明。主要作用包括:1) 与"C"连用,指定按照C的规则编译函数;2) 声明全局变量或函数,使得它们能在多个模块间共享。如果在头文件中使用extern声明全局变量,需确保在某个.c文件中有实际的定义,否则链接时会出现错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先 明白 这个单词 是什么意思?

Extern : 外部 的意思

用法

置于 变量或者函数前,表示变量或者函数的定义在别的文件中,提示 编译器 遇到此变量和函数时,在其他模块中寻找其定义。

作用 主要有两个

第一个 : 与 “C” 一起连用时,如 extern “C” void fun(int a,int b)告诉编译器在编译fun 这个函数名的时候按照C的规则去编译。而不是C++

第二个: 当extern 不与C 一起修饰变量或函数时。如在头文件中:externa int g_int ;作用是: 声明函数或者全局变量 的作用范围的关键字,声明的函数或者变量可以在本模块或者其他模块中使用。记住,它 是一个声明不是定义

extern用在变量声明中常常有这样一个作用,你在*.c文件中声明了一个全局的变量,这个全局的变量如果要被引用,就放在*.h中并用extern来声明。

.具体解释及示例

2.1.extern的变量和函数声明
extern用于修饰变量或函数,用于声明当前变量或函数可以在本模块或者其他模块中使用。不过要记住的是extern只是声明,而不是定义,也就是说extern并不分配空间。而这个查找的过程是在连接的过程中进行的,因此编译阶段虽然找不到该变量或函数,但是也不会报错。下面用三个例子来看一看。

(1)无extern声明,有变量定义。

stdafx.cpp


#include "stdafx.h"
int g_test;
main.cpp

int _tmain(int argc, _TCHAR* argv[])
{
	g_test=2;
	std::cout<<g_test;
	return 0;
}

提示错误,因为此时main中不能调用到g_test。
1>d:\microsoft visual studio 9.0\projects\testcpp\testcpp\testcpp.cpp(25) : error C2065: “g_test”: 未声明的标识符
1>d:\microsoft visual studio 9.0\projects\testcpp\testcpp\testcpp.cpp(26) : error C2065: “g_test”: 未声明的标识符

(2)有extern声明,无变量定义。

stdafx.h


extern int g_test;
main.cpp

int _tmain(int argc, _TCHAR* argv[])
{
	g_test=2;
	std::cout<<g_test;
	return 0;
}

提示错误,因为extern只是声明,并没有定义,也就没有空间的分配,而这时一个链接错误,编译的时候没办法发现。
1>TestCpp.obj : error LNK2001: 无法解析的外部符号 “int g_test” (?g_test@@3HA)
1>D:\Microsoft Visual Studio 9.0\Projects\TestCpp\Debug\TestCpp.exe : fatal error LNK1120: 1 个无法解析的外部命令

(3)有extern声明,也有变量定义。

stdafx.cpp


#include "stdafx.h"
int g_test;
stdafx.h
extern int g_test;
main.cpp
int _tmain(int argc, _TCHAR* argv[])
{
	g_test=2;
	std::cout<<g_test;
	return 0;
}

程序执行正常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值