(转载)extern函数声明

原文地址
常常见extern放在函数的前面成为函数声明的一部分,那么,C语言的关键字extern在函数的声明中起什么作用?

答案与分析:

如果函数的声明中带有关键字extern,仅仅是暗示这个函数可能在别的源文件里定义,没有其它作用。即下述两个函数声明没有明显的区别:
extern int f();int f();
  当然,这样的用处还是有的,就是在程序中取代 include “*.h” 来声明函数,在一些复杂的项目中,我比较习惯在所有的函数声明前添加extern修饰。关于这样做的原因和利弊可见下面的这个例子:“用extern修饰的全局变量”
(1) 在 test1.h 中有下列声明:

#ifndef TEST1H
#define TEST1H
extern char g_str[]; // 声明全局变量g_str
void fun1();
#endif

(2) 在 test1.cpp 中

#include "test1.h"
char g_str[] = "123456"; // 定义全局变量g_str
void fun1() { cout << g_str << endl; }

(3) 以上是 test1 模块, 它的编译和连接都可以通过。
如果我们还有 test2 模块也想使用 g_str , 只需要在原文件中引用就可以了

#include "test1.h"
void fun2()    { cout << g_str << endl;    }

以上 test1 和 test2 可以同时编译连接通过,如果你感兴趣的话可以用ultraEdit打开test1.obj,你可以在里面找到"123456"这个字符串,但是你却不能在test2.obj里面找到,这是因为g_str是整个工程的全局变量,在内存中只存在一份,test2.obj这个编译单元不需要再有一份了,不然会在连接时报告重复定义这个错误!
(4) 有些人喜欢把全局变量的声明和定义放在一起,这样可以防止忘记了定义,如把上面test1.h改为

extern char g_str[] = "123456"; // 这个时候相当于没有extern

然后把 test1.cpp 中的 g_str 的定义去掉,这时再编译连接test1和test2两个模块时,会报连接错误,这是因为你把全局变量g_str的定义放在了头文件之后,test1.cpp这个模块包含了 test1.h 所以定义了一次 g_str,而 test2.cpp 也包含了 test1.h 所以再一次定义了g_str。这个时候连接器在连接test1和test2时发现两个g_str。
如果你非要把g_str的定义放在test1.h中的话,那么就把test2的代码中#include "test1.h"去掉,换成:

extern char g_str[];
void fun2()   {  cout << g_str << endl;   }

这个时候编译器就知道g_str是引自于外部的一个编译模块了,不会在本模块中再重复定义一个出来。
但是我想说这样做非常糟糕,因为你由于无法在test2.cpp中使用#include "test1.h",那么test1.h中声明的其他函数你也无法使用了,除非也用都用extern修饰,这样的话你光声明的函数就要一大串,而且头文件的作用就是要给外部提供接口使用的,所以 请记住, 只在头文件中做声明,真理总是这么简单。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数...
    夏天的雪花雨阅读 466评论 0 0
  • 动态调用动态库方法c/c++linuxwindows 关于动态调用动态库方法说明 一、 动态库概述 1、 动态库的...
    KINGZ1993阅读 14,154评论 0 10
  • 【转载】C&C++——C函数与C++函数相互调用问题 C C++相互调用 在项目中融合C和C++有时是不可避免的,...
    天之道天知道阅读 3,574评论 2 19
  • 概述:声明是将一个名称引入一个程序.定义提供了一个实体在程序中的唯一描述.声明在单个作用域内可以重复多次(类成员除...
    抓兔子的猫阅读 682评论 0 3
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 3,017评论 0 3

友情链接更多精彩内容