看hotspot源码时,涉及到c++的宏,简单了解了一下:
C/C++语言中,预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行相应的转换,预处理过程还会删除程序中的注释和多余的空白符号。预处理指令是以#开头的代码行,#必须是该行除了空白字符外的第一个字符。#后是指令关键字,在#和指令关键字之间允许存在若干空白字符。
#define是C/C++语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率
define中的三个特殊符号:#,##,#@
#define Conn(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x
(1) x##y表示什么?表示x连接y,举例说:
intn = Conn(123,456); /* 结果就是n=123456;*/
char*str = Conn("asdf","adf"); /*结果就是 str = "asdfadf";*/
(2)再来看#@x,其实就是给x加上单引号,结果返回是一个const char。举例说:
char a = ToChar(1); /* 结果就是a='1'; */
做个越界试验char a = ToChar(123);结果就错了;
但是如果你的参数超过四个字符,编译器就给给你报错了!
error C2015: too many characters in constant :P
(3)最后看看#x,估计你也明白了,他是给x加双引号
char* str = ToString(123132); /*就成了str="123132"; */