首页
学习
活动
专区
圈层
工具
发布

Java中的宏变量,宏替换详解。

群友在微信群讨论的一个话题,有点意思,特拿出来分享一下。 输出true false 来看下面这段程序,和群友分享的大致一样。...且个进行==操作却是true有一个是false,而没用final的却是false?...首先来理解下宏变量: Java中,一个用final定义的变量,不管它是类型的变量,只要用final定义了并同时指定了初始值,并且这个初始值是在编译时就被确定下来的,那么这个final变量就是一个宏变量。...编译器会把程序所有用到该变量的地方直接替换成该变量的值,也就是说编译器能对宏变量进行宏替换。...所以,再回到上面的程序,finalWorld2和finalWorld4是final定义的,也是在编译期间能确定下来的,所以它能被宏替换,编译器就会让finalWorld2和finalWorld4指向字符串池中缓存的字符串

4.7K50
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    宏中#和##的用法

    printf(STR(vck)); // 输出字符串"vck"     printf("%d   ", CONS(2,3)); // 2e3 输出:2000     return 0;   }   二、当宏参数是另一个宏的时候...  需要注意的是凡宏定义里有用'#'或'##'的地方宏参数是不会再展开.   1, 非'#'和'##'的情况   #define TOW (2)   #define MUL(a,b) (a*b)  ...2)));   MUL里的参数TOW会被展开为(2).   2, 当有'#'或'##'的时候   #define A (2)   #define STR(s) #s   #define CONS(a,...   ", CONS(A, A)); // compile error    这一行则是:   printf("%s   ", int(AeA));   INT_MAX和A都不会再被展开, 然而解决这个问题的方法很简单...加多一层中间转换宏.   加这层宏的用意是把所有宏的参数在这层里全部展开, 那么在转换宏里的那一个宏(_STR)就能得到正确的宏参数.

    1.6K20

    聊聊Swift中的宏

    聊聊Swift中的宏 宏,Macros是一种常见的编程技术,传统的C语言中,即包含了宏功能。宏这种功能,简单来说是在代码的预编译阶段进行静态替换,是一种非运行时的特性。...但是往复杂了说,宏实际上也提供了一种”元编程“方式,即对程序本身进行编程。如果真正掌握宏的应用,又比较复杂,以C语言中的宏为例,宏可以有参数,可以进行嵌套展开,要编写质量高的宏,还是非常有难度。...但这也有一些缺陷,相比与C语言的宏,Swift中的宏的定义非常抽象,实现复杂,不太利于开发者进行理解。...独立宏有两种角色: expression:创建一段有返回值的代码。 declaration:声明类宏,用来创建声明类的代码。...可以发现,宏的代码编写思路与常规的应用开发思路有很大不同,我们主要需要处理的是对Swift代码本身的语法树结构的解析与补充。

    1.9K10

    内核中的guard宏

    注意:本属性只能作用域function auto scope的变量,也就是说函数中定义的栈上分配的在函数作用域中的变量,参数或者static变量是不行的。...内核中的guard内核作为一个极其复杂的超超超大型c项目,一直都是需要手动在每个return或者goto去处理资源释放之类的操作,如果能用上cleanup岂不是美滋滋。...使用这些宏,我们可以很容易构造出一个自动释放的函数(就是cleanup属性自动调用的释放函数,比如上面例子中的free_A)比如,还是我们之前的例子://之前是这样写的void free_A(char...有什么使用场景呢?..._0会调用__DEFINE_UNLOCK_GUARD宏和__DEFINE_LOCK_GUARD_0宏//__DEFINE_UNLOCK_GUARD宏定义了一个class_preempt_t类型,然后定义了

    13510

    Rust中的过程宏

    宏中的x变量是一个表达式(用x:expr标记),所以在展开后它知道如何正确处理,会将其展开为((1 + 1) * (1 + 1))。 然而这只是书本上常见的宏的简单用法。...学习曲线陡峭是有的,由于本文介绍的重点是过程宏,因此涉及普通宏的内容便不多赘述,有兴趣者可参考官方文档上的介绍。...对于宏编程,Rust中提供了几种过程宏的库操作支持,即: 1、Syn 它是基于TokenStream的一种语法分析过程,它并不很强大,需要自定义扩展一些宏,比如Rust中的函数和闭包等。...过程宏(Procedure Macro)是Rust中的一种特殊形式的宏,它将提供比普通宏更强大的功能。方便起见,本文将Rust中由macro_rules!定义的宏称为规则宏以示区分。...熟悉rust编程的,都应该知道有个继承宏,一直用得到,就是Debug。这是标准库里的,可以帮助调试和显示。所以呢,这里就来实现一个类似功能的继承宏,暂时命名这个过程宏名字为Show。

    3.1K30

    JavaScript中的类有什么问题

    并不是说 JS 的类有问题,但是如果你使用该语言已有一段时间,特别是使用过ES5,那么你可能就知道了从原型继承到当前类模型的演变。 原型链会有什么问题? 以我的拙见,这个问题的答案是:没有。...但是社区花了很多年的时间才将类的概念强加到不同的结构和库中,因此ECMA技术委员会决定无论如何都要添加它。 你会问,这有什么问题吗?...如果我们当前的OOP模型是如此之薄,仅是原型继承的抽象层,那么我们到底缺少什么呢? 是什么让JS真正成为OOP? 看这个问题的一个好方法就是看看TypeScript在做什么。...换句话说,重复该名称,但要确保其接收不同的参数。 现在我们有了JS的rest参数,这使我们可以拥有一个任意数字,但是,这也意味着我们必须在方法中添加额外的代码来处理这种动态性。...受保护的属性和方法 我们已经有了公开的可见性,而且我们很快就得到了方法和属性的私有可见性(通过#前缀)。

    2.6K10

    JavaScript中的类有什么问题呢?

    上已经收录,文章的已分类,也整理了很多我的文档,和教程资料。 并不是说 JS 的类有问题,但是如果你使用该语言已有一段时间,特别是使用过ES5,那么你可能就知道了从原型继承到当前类模型的演变。...原型链会有什么问题? 以我的拙见,这个问题的答案是:没有。 但是社区花了很多年的时间才将类的概念强加到不同的结构和库中,因此ECMA技术委员会决定无论如何都要添加它。 你会问,这有什么问题吗?...如果我们当前的OOP模型是如此之薄,仅是原型继承的抽象层,那么我们到底缺少什么呢? 是什么让JS真正成为OOP? 看这个问题的一个好方法就是看看TypeScript在做什么。...换句话说,重复该名称,但要确保其接收不同的参数。 现在我们有了JS的rest参数,这使我们可以拥有一个任意数字,但是,这也意味着我们必须在方法中添加额外的代码来处理这种动态性。...受保护的属性和方法 我们已经有了公开的可见性,而且我们很快就得到了方法和属性的私有可见性(通过#前缀)。

    2.3K10

    DragonOS中的READ_ONCE()宏和WRITE_ONCE()宏

    DragonOS中实现了与Linux相似的READ_ONCE()宏以及WRITE_ONCE()宏,主要目的在于解决并行计算场景下,编译器错误的优化导致的数据访问错误的问题。...下面进行简单的介绍: 这两个宏主要是为了解决并行访问的问题的。编译器在优化代码的时候,会对一些操作进行重排序,或者删掉一些它认为无用的操作。...这些优化在单线程的环境下不存在问题,但是对于操作系统而言,时刻都存在着并行的计算,这样的乱序处理很可能会造成问题。...为了保证代码之间不乱序,我们可以使用READ_ONCE()和WRITE_ONCE()宏,告知编译器涉及到的操作之间不能乱序。...他们之间的区别 细心的小伙伴会发现:对于读取一个变量的值,好像这两个宏都能实现哦!对于这个问题,我们需要回到最开始的出发点:我们到底是要保护哪个操作不被乱序?

    98720

    【十分钟教会你汇编】MIPS编程入门

    无意中找到一篇十分好用,而且篇幅也不是很大的入门教程,通篇阅后,再把“栗子”敲一遍,基本可以有一个比较理性的认识,从而方便更好地进一步深入学习。...下一共有32个通用寄存器 在汇编中,寄存器标志由$符开头 寄存器表示可以有两种方式 直接使用该寄存器对应的编号,例如:从$0到$31 使用对应的寄存器名称,例如:$t1, $sp(详细含义,下文有表格...从内存中 复制 RAM_source 的内容到 对应的寄存器中 (lw中的'w'意为'word',即该数据大小为4个字节) lb register_destination, RAM_source...---- System Calls and I/O (SPIM Simulator) 系统调用 与 输入/输出(主要针对SPIM模拟器) (本人使用的是Mars 4.4,也通用--!)...入门之旅到此告一段落, 下面我把用到的一些软件和这篇文章的原文链接贴到下边,有需要的, 各位客官自取哈~~~ 1.Mars4.4 2.PCSpim Simulator 3.

    3.1K75

    问题有多大,中台就有多大

    大部分的商业行为都是为了解决现实问题,而大部分战略级决策的形成也都是基于这些问题的解决。...“中台和平台都是一种共性能力,”汪源说,“它们的核心区别在于中台有业务属性,而平台没有。”...服务于以上谈及的网易的互联网业务,网易杭州研究院已经陆续建设了有超过十个中台,例如在线业务中台、数据中台、用户中台、质量中台、移动研发中台、商业智能中台…… 推荐搜索中台是一个非常容易理解的业务中台。...在与工商银行、国家电网、申万宏源证券等行业头部企业的合作中,网易已经开始提供基于方法论等支柱能力为核心的专业咨询服务。...就解决当下的问题而言,更多企业,如果希望建设业务创新能力,就还需要为中台技术支撑体系的成熟而奋斗。 【IT创事记】创见科技未来。

    1.5K20

    ReactiveCocoa 中 奇妙无比的 “宏” 魔法

    在ReactiveCocoa 中,封装了很多非常实用的“宏”,使用这些“宏”为我们开发带来了很多的便利。 今天就来盘点一下RAC中的宏是如何实现的。...计算机语言如C语言或汇编语言有简单的宏系统,由编译器或汇编器的预处理器实现。C语言的宏预处理器的工作只是简单的文本搜索和替换,使用附加的文本处理语言如M4,C程序员可以获得更精巧的宏。...Lisp类语言如Common Lisp和Scheme有更精巧的宏系统:宏的行为如同是函数对自身程序文本的变形,并且可以应用全部语言来表达这种变形。...如果是超过2,3层的多层的情况,就该考虑考虑宏设计的语意的问题,尽量不让使用者产生错误的用法。...在实际使用过程中,这不是一个问题,因为@onExit后面如果没有大括号,那么它是一个无用的结构,不会有任何事情发生。 最后 关于ReactiveCocoa里面所有宏的实现分析都已经分析完成。

    3.3K30

    产品设计中,DFMEA存在的问题有哪些?

    尽管DFMEA的功能强大,但目前在国内的应用中还存在诸多问题,如企业对DFMEA的效益与价值认识不清楚 、 开发周期紧张无法完成DFMEA检查等。...在实际中,DFMEA 由具有设计责任的产品设计小组的某个设计人员按照自身的经验进行编制。...受工程师自身素质和经验的限制,常常会出现问题根源分析不全面、找不到好的解决方案等,进而导致DFMEA的内容苍白无力。...尽管频度等参数在使用中参考了国外的标准,但由于国内外的设计及制造水平存在明显的差异,完全照搬不可行。一些参数在相邻的分数之间决断时难以作出判断。...实际上DFMEA中 的风险系数 (Risk PriorityNumber, RPN)的数值具有不连续性,即使相同的RPN 数值代表的意义也并非完全一致,故完全根据 RPN 数值来判断失效模式存在风险。

    1.2K20

    C 库中的断言与 FreeRTOS 中的 trace 宏

    在 C 编程领域,断言和 FreeRTOS 中的 trace 宏都有着独特而重要的作用。 一、断言(assert) 断言在一般的 C 库中是一个非常有用的工具,它以函数的形式存在。...= 0 为假,程序将会中止,并输出错误信息,帮助我们发现问题所在。...二、FreeRTOS 中的 trace 宏 FreeRTOS 中定义了许多以 trace 开头的宏,这些宏被巧妙地放置在系统的各个关键位置。在默认情况下,这些宏通常被定义为空宏。...而当我们需要调试任务执行流程时,只需简单地修改这些宏的定义,使其执行打印操作,就能够方便地获取任务的执行信息,帮助我们排查问题。...合理地运用它们能够显著提高程序的可靠性和可维护性。 “学如逆水行舟,不进则退。”愿此篇文章成为你在技术之舟上的有力浆橹。有任何感悟或困惑,可于评论区交流探讨。

    10810
    领券