namespace命名空间与define预处理

在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取的是最新的值,也就说预处理语句没有命名空间的概念,无论你定义在哪个命名空间对于程序来说都是可见的。

时间: 2024-11-03 21:52:59

namespace命名空间与define预处理的相关文章

OC高效率52之多用类型常量,少用#define预处理指令

// //  ViewController.m //  OC高效率52之多用类型常量,少用#define预处理指令 /**  *     1. 不要用预处理定义常量.这样定义出来的常量不含类型信息,编译器只是会在编译前据此执行查找与替换操作.即时有人重新定义了常量值,编译器也不会产生警告信息,这将导致应用程序中得常量值不一致.        2.在实现文件中使用static const 来定义"只在编译单元内可见的常量".由于此类常量不在全局符号表中,所以无需为其名称加前缀.     

4、多用类型常量,少用#define预处理指令

摒弃: #define ANIMATION_DURATION 0.3 #define ERROR_MESSAGE @"ErrorMessage" 1)没有常量的类型信息 2)假设此指令声明在某个头文件中,那么所有引入了这个头文件的代码,都可以访问和修改ANIMATION_DURATION. 推荐: 1.私有常量 .m文件 static const NSTimeInterval kAnimationDuration = 0.3; static NSString *const kError

namespace 命名空间

一.命名空间的定义 namespace 命名空间的名字 {类/变量/函数/模板/其他命名空间}; 命名空间空间可以定义在全局作用域和其他命名空间中,但不能定义在函数或类的内部. 二.命名空间的作用域 每一个命名空间都是一个作用域,定义在某个命名空间中的名字可以被该命名空间内的其他成员访问,也可以被这些成员的内嵌作用域中的任何单位访问. namespace nsp{ int num=10; class ab { public: int val(){return num;} }; } int val

Effective Objective-C 2.0 — 第四条:多用类型常量,少用#define预处理指令

第四条:多用类型常量,少用#define预处理指令 使用#define 预处理的坏处:定义出来的常量没有类型信息,编译器只是会在编译前据此执行查找与替换操作.即使有人重新定义了常量值,编译器也不会产生警告信息,这将导致应用程序中的常量值不一致. 使用例如:static const NSTimeInterval kAnimationDuration = 0.3; 在实现文件中使用 static const 来定义“只在编译单元内可见的常量”.由于此类常量不再全局符号表中,所以无须为其名称加前缀.

php中的namespace 命名空间

名字解释: namespace(命名空间),命名空间是从php5.3开始支持的功能.作用主要有两个:1.可以避免类名取得过长.2.当在多个框架配合使用时,同名的类之间不会冲突. 命名空间,看名字就知道,目的就是为了命名的,不然咋不叫QQ空间 盗梦空间 七度空间.额 好像有奇怪的掺进来了. 下面是示例代码: 1 //在test1.php 中有一个类 叫做Person,它放在一个叫shop的namespace里. 2 <?php 3 namespace shop;//这个声明要放在php文件的最上面

XML Namespace 命名空间

根据 Namespaces in XML W3C 推荐标准的定义,XML 命名空间 是由国际化资源标识符 (IRI) 标识的 XML 元素和属性集合:该集合通常称作 XML“词汇”. 定义 XML 命名空间的主要动机之一是在使用和重用多个词汇时避免名称冲突.XML 模式用于为 XML 实例创建一个词汇并频繁使用命名空间.因此,正确理解命名空间概念对于从总体上理解 XML 模式和实例验证至关重要. 命名空间在多个方面类似于 Java 中的程序包: Java 中的程序包可以包含许多可重用的类和接口.

第4条:多用类型常量,少用#define预处理指令

定义常量的几种方式: 1.#define ANIMATION_DURAION 0.3         //定义了一个动画时长的常量, 预处理过程会把碰到的所有ANIMATION_DURAION一律替换成0.3 2.static const NSTimeInterval kAnimationDuration = 0.3;  //static 意味着该变量仅在定义此变量的编译单元中可见(也是.m文件).这种常量不出现在全局符号表中. 3. extern NSString *const StringC

第一章 01 namespace 命名空间

一.什么是namespace? namesapce是为了防止名字冲突提供的一种控制方式. 当一个程序需要用到很多的库文件的时候,名字冲突有时无法避免.之前的解决思路是使用更长的变量名字,使用不方便. 二.命名空间的定义 1.namespace   空间名称 { 变量: 函数: 类: } 三.命名空间的特点 1.每个命名空间都有自己的作用域: 2.命名空间可以是不连续的,正像代码中的所列举的例子: 1.1 如何理解命名空间的作用域 1 namespace global_namespace{ 2 3

Python Namespace - 命名空间

命名空间 命名空间 namespace 对 python 来说是一个非常核心的概念,整个 python 虚拟机运行的机制与 namespace 概念有这非常紧密的联系. 从'赋值'说起, python 中的赋值语句是一类特殊的语句,原因是因为它们会影响 namespace. python 中的赋值语句首先创建一个 对象 object,然后将 obj '赋值' 给一个名字 name (理解为赋值给一个变量) 赋值语句执行后, 我们的一个 name 和 object 的关联关系, 称之为'约束',