extern 总结

extern

   在源文件A里定义的函数,在其它源文件里是看不见的(即不能访问)。为了在源文件B里能调用这个函数,应该在B的头部加上一个外部声明:

  extern   函数原型;   

  这样,在源文件B里也可以调用那个函数了。   
  注意这里的用词区别:在A里是定义,在B里是声明。一个函数只能(也必须)在一个源文件里被定义,但是可以在其它多个源文件里被声明。定义引起存储分配,是真正产生那个实体。而声明并不引起存储分配。打一个粗俗的比方:在源文件B里声明后,好比在B里开了一扇窗,让它可以看到A里的那个函数。

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

 Test.cpp

extern const CString a = "aaa";
Main.cpp
extern const CString a;
void CTestMFCDlg::OnOK() 
{
	AfxMessageBox(a);
	CDialog::OnOK();
}

 下面的代码也是没问题的

Test.cpp

CString a = "aaa";

Main.cpp
extern  CString a;
void CTestMFCDlg::OnOK() 
{
	AfxMessageBox(a);
	CDialog::OnOK();
}
但是将a改成Const CString 类型就有问题了

Test.cpp

 const CString a = "aaa";

Main.cpp

extern const CString a;
void CTestMFCDlg::OnOK() 
{
	AfxMessageBox(a);
	CDialog::OnOK();
}

让我感到很困惑。
 extern变量问题1

 定义了一个数组

char a[6];

  在另外一个文件里用下列语句进行了声明:

extern char *a;

  请问,这样可以吗?

  答案与分析:

  1)、不可以,程序运行时会告诉你非法访问。原因在于,指向类型T的指针并不等价于类型T的数组。extern char *a声明的是一个指针变量而不是字符数组,因此与实际的定义不同,从而造成运行时非法访问。应该将声明改为extern char a[ ]。

  2)、例子分析如下,如果a[] = "abcd",则外部变量a=0x61626364 (abcd的ASCII码值),*a显然没有意义,如下图:



  显然a指向的空间(0x61626364)没有意义,易出现非法内存访问。

  3)、这提示我们,在使用extern时候要严格对应声明时的格式,在实际编程中,这样的错误屡见不鲜。

  4)、 extern用在变量声明中常常有这样一个作用,你在*.c文件中声明了一个全局的变量,这个全局的变量如果要被引用,就放在*.h中并用extern来声明。
2.如果函数的声明中带有关键字extern,仅仅是暗示这个函数可能在别的源文件里定义,没有其它作用。即下述两个函数声明没有区别:

Test.cpp

void print(char *s)
{
	CString str;
    str.Format("The string is %s/n",s);
     AfxMessageBox(str);
}
Main.cpp

void print(char *p);
void CTestMFCDlg::OnOK() 
{
	char *p="hello world!";
	print(p);
	CDialog::OnOK();
}
没有包含Test.h头文件。void print(char* p) 与extern  void print(char* p) 效果一样

3、extern 用在声明引用的类时候,需要包含类的头文件

Test.h

class acls
{
private:
CString m_str;
public:
acls(){m_str = "acls";}
};
extern acls a1;
Main.cpp

#include "Test.h"
acls a1;
void CTestMFCDlg::OnOK() 
{
	AfxMessageBox(a1.m_str);
	CDialog::OnOK();
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值