作者cppOrz (cppOrz)
看板C_and_CPP
标题Re: [问题] global structure?
时间Sat Jan 14 02:26:50 2006
extern 有很多种用法。
简单地说,extern 只作一个「宣称」的动作,并不产生变量的实体。
所以通常是用来处理 global 变量(物件),例如:
// File1.h
extern int global_val;
// File1.c
int global_val = 123;
这样任何 include "File1.h" 的模组都可以直接操作 global_val;
但由於 C/C++ 规定使用 extern 宣告的变量,只需要刚好有一份实体
即可,没有限制一定要放在同一个模组,所以事实上也可以这样使用:
// File2.c
int val = 456;
// File3.c
extern int val;
即使 File3 模组与 File2 模组没有任何关系,只要经过 extern 宣告
在 File3 模组内就可以操作到 val,当然,val 变量的实体必须刚好
只有一份。
可以看见,明明 File2.c 没有被任何其他模组使用到,但只要通过
extern,就可以轻易破坏封装性。
因此,为了避免 global 变量不小心被跨转译单元误用,即使它的宣告和
定义都是放在 .c 或 .cpp (也就是不在 .h 或 .hpp 宣告它),保险的
作法是以关键字 static 或者不具名的 namespace 给它强制:
// File2.c
static int val = 456; // C 语言
或者
namespace
{
int val = 456; // C++
}
这样一来,就限定 val 变量只能在 File2.c 使用了,其他模组(不管是
在 .h 或 .c 档中)就算 extern int val; 也不会不小心误用。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.120.214.120