C/C++的宏
来源:互联网 发布:国外问卷调查赚钱知乎 编辑:程序博客网 时间:2024/05/18 02:49
在语法上##的含义吧?
它是个用在宏中的关键字. 表示将前后数据连接起来.
如: #define Conn(str) str##MyName
这样使用 Conn(123),则等价于 123MyName
- 宏是一个较为简单的概念,在编译C/C++代码前,预处理器将宏代码展开,这样编译出来的代码在运行时就省去了一些额外的空间和时间开销。因此,使用宏可以在不影响程序运行性能的前提下,提高代码的可读性。HotSpot项目中,许多情形都使用了宏。
(1) .功能相似的数据结构。
在HotSpot中出现的所有内部对象,都需要一个类型进行定义。HotSpot为了能够更好地管理内部的对象表示,设计了一套面向对象表示系统,即OOP-Klass二分模型。在这个模型中需要定义许多内部类型。考虑到很多类型具有相似的定义方式,出于模块化和可扩展性的设计思维,HotSpot的设计者巧妙地实现了对各种相似类型的通用定义。在定义OOP结构类型事,设计了DEF_OOP宏,它能根据传入的type参数定义出不同的oopDesc类型。
hotspot/src/share/vm/oops/oopsHierarchy.hpp
#define DEF_OOP(type) \ class type##OopDesc; \ class type##Oop : public oop { \ public: \ type##Oop() : oop() {} \ type##Oop(const volatile oop& o) : oop(o) {} \ type##Oop(const void* p) : oop(p) {} \ operator type##OopDesc* () const { return (type##OopDesc*)obj(); } \ type##OopDesc* operator->() const { \ return (type##OopDesc*)obj(); \ } \ }; \DEF_OOP(instance);DEF_OOP(method);DEF_OOP(methodData);DEF_OOP(array);DEF_OOP(constMethod);DEF_OOP(constantPool);DEF_OOP(constantPoolCache);DEF_OOP(objArray);DEF_OOP(typeArray);DEF_OOP(klass);DEF_OOP(compiledICHolder);
hotspot/src/share/vm/runtime/handle.hpp
//------------------------------------------------------------------------------------------------------------------------// Specific Handles for different oop types#define DEF_HANDLE(type, is_a) \ class type##Handle; \ class type##Handle: public Handle { \ protected: \ type##Oop obj() const { return (type##Oop)Handle::obj(); } \ type##Oop non_null_obj() const { return (type##Oop)Handle::non_null_obj(); } \ \ public: \ /* Constructors */ \ type##Handle () : Handle() {} \ type##Handle (type##Oop obj) : Handle((oop)obj) { \ assert(SharedSkipVerify || is_null() || ((oop)obj)->is_a(), \ "illegal type"); \ } \ type##Handle (Thread* thread, type##Oop obj) : Handle(thread, (oop)obj) { \ assert(SharedSkipVerify || is_null() || ((oop)obj)->is_a(), "illegal type"); \ } \ \ /* Special constructor, use sparingly */ \ type##Handle (type##Oop *handle, bool dummy) : Handle((oop*)handle, dummy) {} \ \ /* Operators for ease of use */ \ type##Oop operator () () const { return obj(); } \ type##Oop operator -> () const { return non_null_obj(); } \ };
在DEF_HANDLE宏定义中,根据外部传入的type和is_a等参数,可以定义出不同的handle类型
DEF_HANDLE(instance , is_instance )DEF_HANDLE(method , is_method )DEF_HANDLE(constMethod , is_constMethod )DEF_HANDLE(methodData , is_methodData )DEF_HANDLE(array , is_array )DEF_HANDLE(constantPool , is_constantPool )DEF_HANDLE(constantPoolCache, is_constantPoolCache)DEF_HANDLE(objArray , is_objArray )DEF_HANDLE(typeArray , is_typeArray )
阅读全文
0 0
- 一个小小的C语言宏定义错误 - [C,C++]
- [c、c++]宏中"#"和"##"的用法
- [C/C++] 简单有用的enum2string宏
- [c、c++]宏中"#"和"##"的用法
- c++/C 的用户手册
- C宏的用法
- C/C++的宏
- c语言的宏
- C/C++的宏
- C 的__VAR_ARGS__宏
- c的函数宏
- c语言的宏
- C 宏的陷阱
- C/C++的宏
- [c/c++]宏定义,#,##
- [c/c++]宏定义,#,##
- [c/c++]宏定义,#,##
- C++/C 宏列表
- 编程珠玑 Pearls(8)
- Java SE Demos and Samples 阅读笔记(1.1 db)
- 编程珠玑 Pearls(11 .排序)
- 编程珠玑 Pearls(9. 代码调优)
- CentOS
- C/C++的宏
- windows hadoop
- VS Code
- VS Code调试js
- algorithm 4th笔记(1.2)
- 编程珠玑 Pearls(5)编程小事
- 名人博客站点
- java maven项目文档生成
- 程序员面试金典