【C++基础之七】extern关键字

21 篇文章 49 订阅

1.作用

(1)放在函数或者变量前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。

(2)与“C”连用,作为连接指定。


2.具体解释及示例


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;
}
程序执行正常。

2.2.extern "C"

这是个霸气外露的东西啊。好吧,历史遗留问题,最早的标准C编译器编译引用出来的变量和函数就是在名字前面加个下滑杠,比如void foo(int a,int b);编译器引用的函数名是_foo,后来的C编译器都是遵循这个标准。
可是后来C++出现了,他的重载特性使得不同的编译器对它进行了不同的处理,比如void foo(int a,int b);就可能被编译器引用出来后变为_foo_int_int之类的,把函参也放进函数名中,从而实现了重载。为了保证不同厂家生产的模块之间的兼容性,并且可以调用原先开发好的C模块,就引出了一个extern "C"的方法,通过这种定义来告诉编译器:请按照C的方法来对我这个函数进行编译,保持我的名称。这样不同厂家的C和C++中的变量,函数,类就得到了一致化的处理,兼容性也就解决了。

这是一个标准的extern "C"的写法。这在dll的编写上作用很大。
//在.h文件的头上
#ifdef __cplusplus
#if __cplusplus
extern "C"{
 #endif
 #endif /* __cplusplus */ 
 …
 …
 //.h文件结束的地方
 #ifdef __cplusplus
 #if __cplusplus
}
#endif
#endif /* __cplusplus */

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
extern关键字在C语言中有多种用法。 第一种用法是在变量的声明中使用extern关键字,表示该变量在其他源文件中定义。例如,extern const char Buffer[];表示Buffer变量在其他文件中定义,并可以在当前文件中使用。 第二种用法是在函数的声明中使用extern关键字,表示该函数可能在其他源文件中定义。例如,extern int f();表示f函数可能在其他文件中定义,并可以在当前文件中使用。 第三种用法是在C++中使用extern "C"来指定函数的链接方式。这是为了解决C++函数重载带来的函数名和参数不同导致链接错误的问题。通过extern "C"修饰函数,告诉编译器保持函数名称不变,不生成用于链接的中间函数名。这通常在C++代码中与C函数交互时使用。 总而言之,extern关键字在C语言中用于声明变量和函数的链接方式,以及在C++中用于修饰函数以保持函数名称不变。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++全局变量的定义和声明](https://blog.csdn.net/webzhuce/article/details/38899635)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C/C++extern关键字详解](https://blog.csdn.net/weixin_38218095/article/details/96473556)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值