在c++语言中是namespace是定义命名空间,或者说是定义作用域,在c++中最常见的划分作用域是使用{},同时C++里有define关键词,用来定义一个宏,或者说是预处理变量,那么这种预处理变量与namespace又如何去划分呢?示例代码如下:
#include <iostream> using std::endl; using std::cout; namespace test1 { #define MYSIZE 1000 const int size = 10000; int a = 10; }; namespace test2 { #define MYSIZE 2000 const int size = 20000; int a = 20; } int a = 40; int main() { int a = 30; cout<<"test1::MYSIZE="<<MYSIZE<<endl; cout<<"test2::MYSIZE="<<MYSIZE<<endl; cout<<"test1::size="<<test1::size<<endl; cout<<"test2::size="<<test2::size<<endl; cout<<"test1::a="<<test1::a<<endl; cout<<"test2::a="<<test2::a<<endl; cout<<"main::a="<<a<<endl; cout<<"global::a="<<::a<<endl; return 0; }
该示例除了说明namespace与define的区别之外,还附带了命名空间的作用域问题,首先需要说明的是代码不能这样写:
cout<<"test1::MYSIZE="<<test1::MYSIZE<<endl; cout<<"test2::MYSIZE="<<test2::MYSIZE<<endl;
编译错误如下:
namespacedefine.cpp:20:33: error: expected unqualified-id before numeric constant
namespacedefine.cpp:20:33: error: expected ‘;’ before numeric constant
namespacedefine.cpp:21:33: error: expected unqualified-id before numeric constant
namespacedefine.cpp:21:33: error: expected ‘;’ before numeric constant
于是使用示例中的代码,编译时有warning:
namespacedefine.cpp:12:0: warning: "MYSIZE" redefined [enabled by default]
namespacedefine.cpp:6:0: note: this is the location of the previous definition
大概说是变量重复定义,表示MYSIZE重复定义了,再看看输出结果:[email protected]:~/practice$ ./a.out
test1::MYSIZE=2000
test2::MYSIZE=2000
test1::size=10000
test2::size=20000
test1::a=10
test2::a=20
main::a=30
global::a=40
发现MYSIZE取的是最新的值,也就说预处理语句没有命名空间的概念,无论你定义在哪个命名空间对于程序来说都是可见的。