美文网首页
C/C++的宏

C/C++的宏

作者: 百炼 | 来源:发表于2016-12-11 13:03 被阅读0次

在语法上##的含义吧?

它是个用在宏中的关键字. 表示将前后数据连接起来.
如: #define Conn(str) str##MyName
这样使用 Conn(123),则等价于 123MyName

  1. 宏是一个较为简单的概念,在编译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        )

相关文章

  • c++技巧

    使用c/c++宏进行编程 c/c++中宏的是在预处理的过程中进行展开,可以用来进行函数的声明和定义. 在阅读lib...

  • 深入理解C++11 2.5 static_assert

    在C++中,标准在或者 头文件中未程序员提供了assert宏,例如: C++中,可以通过定义宏N...

  • C/C++的宏

    在语法上##的含义吧? 它是个用在宏中的关键字. 表示将前后数据连接起来.如: #define Conn(str)...

  • C++ 命名空间namespace

    本文转载自:C++ 命名空间namespace 在C++中,名称(name)可以是符号常量、变量、宏、函数、结构、...

  • 常见源码中的宏定义

    1._ _cplusplus 、extern "c" { }_ _cplusplus 是c++中特有的宏定义,在我...

  • CINTERFACE 宏的作用

    CINTERFACE宏用于在c++项目中使用c风格(规范)的COM 接口调用。

  • C/C++ 宏定义

    宏定义在C语言占有举足轻重的地位。底层框架自不用说,为了编译优化和方便,以及跨平台能力,宏被大量使用,可以说底层开...

  • C++中的内联函数

    1、常量与宏回顾 C++中的const常量可以替代宏常数定义,如: const int A = 3; <===>...

  • CPP常识 04 -- 宏,#号##号,可变参数

    文章来自于这里:c语言中的宏,#号##号,可变参数 C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于...

  • C++ assert

    断言,是宏,而非函数。assert 宏的原型定义在 (C)、(C++)中。其作用是如果它的条件返回错误,则终止程...

网友评论

      本文标题:C/C++的宏

      本文链接:https://www.haomeiwen.com/subject/tjhpmttx.html