extern

luoyunying 2008-09-08 09:57:12
我一直没有想明白,为调用外部函数所写的头文件(外部函数的声明)中用不用extern都是一样,高手出来区别一下。
extern变量也搞清楚!!!!!!
...全文
301 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
帅得不敢出门 2008-09-08
  • 打赏
  • 举报
回复
extern 函数
当函数提供方单方面修改函数原型时,如果使用方不知情继续沿用原来的extern申明,这样编译时编译器不会报错。但是在运行过程中,因为少了或者多了输入参数,往往会照成系统错误,这种情况应该如何解决?

  答案与分析:

  目前业界针对这种情况的处理没有一个很完美的方案,通常的做法是提供方在自己的xxx_pub.h中提供对外部接口的声明,然后调用方include该头文件,从而省去extern这一步。以避免这种错误。

  宝剑有双锋,对extern的应用,不同的场合应该选择不同的做法。
疯哥哥 2008-09-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 luoyunying 的回复:]
引用 2 楼 Crazii 的回复:
不加extern,但是又没有函数定义体的时候,编译器会把它解释成extern,等到链接的时候如果真的找不到符号,就报错.
如果你的函数在外部定义,最好显式声明extern

变量的话,就不一样了,加extern跟没加extern完全不一样.前者是外部变量声明,后者是变量的定义.


你对函数的解释==没有说
你对变量我认同 但它声明有什么用,我可以要用的时候直接定义就行了呀?
[/Quote]

声明一个外部变量就是要使用外部变量.
假如你一个工程里面有两个Cpp文件,其中文件1 内声明了一个全局变量int i;
文件2如果想要访问文件1中的那个i,就用得extern int i;这样文件2就可以读写文件1 中定义的变量了.
否则,文件2内的int i;跟文件1内的int i;不是同一个i.....
K行天下 2008-09-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 luoyunying 的回复:]
引用 1 楼 akirya 的回复:
int x;这是变量定义,不能多次
extern int x;这是变量声明,可以有N次.但必须只能有一次变量定义.

至于函数,实现只能出现一次,声明可以有N次.


还是没有我想听的 extern int x;这是变量声明,可以有N次(我声明N次做什么?).但必须只能有一次变量定义(在全局定义就是全局变量?在局部定义就是局部变量?我定义了还可以赋值?)

至于函数,实现只能出现一次,声明可以有N次(我声明…
[/Quote]

extern int x;没有听说过,除非你的程序只有一个cpp/c文件
如果是一个工程,多个源文件,那么如果在1.cpp中定义 int x; 如果2.cpp要访问它怎么办呢? 一般是 在头文件1.h中声明:extern int x;
在2.cpp中使用#include "1.h",这样就避免重复定义,因为int x是定义,为x分配了内存空间,extern int x 只是纯声明,不分配内存空间

如果3.cpp文件要使用,也可以include,反正在这个项目中x只被定义了一次,却声明了多次。






再看extern函数:
用extern修饰函数是表示被修饰的函数定义在当前文件外,而该函数用extern声明类型后就可以被当前文件调用了。
使用extern修饰某函数时,对该函数的调用是在连接阶段才被处理的。下面我们看一段代码。

/***********************************************
* fun.c
***********************************************/

#include <stdio.h>

void fun (int n)
{
printf("%d\n");
}


/***********************************************
* test.c
***********************************************/

extern void fun (void);

int main ()
{
fun();
return 0;
}

着两个文件能编译连接到一起吗?答案是肯定的,而且不会出现警告。那我们运行这个程序看看什么结果:

C:\> test.exe
2367460

这个数从哪来的?不知道。这是因为我们调用了一个需要参数的函数而没有传递参数给它,而这个函数还傻乎乎的以为传过了参数,从寄存器里读出它的参数就去干活了。那个寄存器里是什么值?谁也说不准。如果fun函数的参数是作为指针使用……,啊!麻烦大了!

要解决问题,对于上面的小程序,我们直接冲过去改掉就成了。但是如果你的程序里有1000个文件,平均每个文件5000行(真正大的项目要比这大的多),那你还能一行行检查下去吗?如果调试过程中出了问题而你还不知道是这个原因导致的,如果你的程序很少运行到这个地方,……

所以,正确的方法是防患于未然,写代码是养成良好的习惯。

对于使用gcc的朋友,建议总是使用“-Wall”,“-Wall”是一个细心的秘书,他会及时提醒你代码中存在的风险。

尽量避免使用extern修饰函数。一般情况下,如果我们希望某个函数可以被外界使用,就创建一个头文件,在其中声明该函数的类型。哪个程序需要调用这个函数就把它的头文件包含进去。这样一来如果调用的地方使用不当,在编译阶段就会提示错误,也节省了时间。而且,定义函数和声明函数是同一个人做的,出错的机会也就小了。
luoyunying 2008-09-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Crazii 的回复:]
不加extern,但是又没有函数定义体的时候,编译器会把它解释成extern,等到链接的时候如果真的找不到符号,就报错.
如果你的函数在外部定义,最好显式声明extern

变量的话,就不一样了,加extern跟没加extern完全不一样.前者是外部变量声明,后者是变量的定义.
[/Quote]

你对函数的解释==没有说
你对变量我认同 但它声明有什么用,我可以要用的时候直接定义就行了呀?
luoyunying 2008-09-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 akirya 的回复:]
int x;这是变量定义,不能多次
extern int x;这是变量声明,可以有N次.但必须只能有一次变量定义.

至于函数,实现只能出现一次,声明可以有N次.
[/Quote]

还是没有我想听的 extern int x;这是变量声明,可以有N次(我声明N次做什么?).但必须只能有一次变量定义(在全局定义就是全局变量?在局部定义就是局部变量?我定义了还可以赋值?)

至于函数,实现只能出现一次,声明可以有N次(我声明一次就行了为什么还可以声明N次?).
feelkill 2008-09-08
  • 打赏
  • 举报
回复
同意楼上的说法的.
疯哥哥 2008-09-08
  • 打赏
  • 举报
回复
不加extern,但是又没有函数定义体的时候,编译器会把它解释成extern,等到链接的时候如果真的找不到符号,就报错.
如果你的函数在外部定义,最好显式声明extern

变量的话,就不一样了,加extern跟没加extern完全不一样.前者是外部变量声明,后者是变量的定义.
  • 打赏
  • 举报
回复
int x;这是变量定义,不能多次
extern int x;这是变量声明,可以有N次.但必须只能有一次变量定义.

至于函数,实现只能出现一次,声明可以有N次.

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧