名字空间

在大型程序(尤其是由很多人一起撰写的程序)中,常常遇到不同的变量、函数等取了同样的名字而造成名字的冲突。例如:

   1 // mfc.cpp:
   2 int inflag = 10;

   1 //owl.cpp:
   2 int inflag = 20;

   1 //main.cpp:
   2 extern int inflag;
   3 main() {   
   4    inflag = 30;
   5 }

这个问题在C++中,可以使用名字空间(namespace)来解决冲突:

   1 namespace mfc {
   2     int inflag;
   3     // ...
   4 }     //no semicolon here
   5 

   1 namespace owl {
   2     int inflag;
   3     //…
   4 }

   1 int main() {
   2     mfc::inflag = 3;
   3     owl::inflag = -823;
   4 }

::被称作域操作符,可以用来访问某个名字空间中的成员。此外还可以用来访问与局部变量同名的全局变量,比如

   1 int i;
   2 int main() {
   3     int i = 0;
   4     i = i +1;
   5     ::i = i;
   6 }

更多名字空间的例子:

   1 namespace mfc {
   2    int inflag;
   3    void function(int a) {
   4       //…
   5    }
   6    typedef unsigned short WORD;
   7    struct Teacher{
   8       //...
   9    };
  10    class Student {
  11       //...
  12    };
  13    #define PI 3.14159
  14 }

注意:宏定义不受名字空间限制

访问名字空间中的成员:

   1 int main() {
   2     mfc::inflag = 10;
   3     mfc::function(mfc::inflag);
   4     mfc::WORD w;
   5     struct mfc::Teacher t;
   6     class mfc::Student s;
   7     double p = PI; //no mfc here
   8 }

简化名字空间成员的访问:using declaration

   1 int main() {
   2     using mfc::inflag;
   3     inflag = 3;
   4     mfc::function( inflag );
   5 }

更多的简化访问:using direction

   1 int main() {
   2     using namespace mfc;
   3     inflag = 3;
   4     function(inflag);
   5     WORD w;
   6     owl::inflag = 10;
   7 }


CategoryCpp

C++:名字空间 (last edited 2008-03-13 21:00:06 by czk)

ch3n2k.com | Copyright (c) 2008 czk. 浙ICP备06000584号