g++中宏NULL究竟是什么?.pdf NULL是个指针,还是个整数?0?或(void*)0?答案是和g++版本有关。g++ 4.6支持C++11,引入了nullptr,也许会发生变化。...下面再借助gdb,来看一看它的真面目(博文:《GDB高级技巧》有介绍gdb的高级使用)。...(gdb) 从gdb的跟踪结果,不难看到NULL的真身是__null,但__null又是什么了?...,那么__null只能是g++内置定义的,所以未出现在任何头文件中,事实证明也如此,在代码中可以直接使用__null(尽管如此,但这个不是个好主意): #include #include int main...搜索gcc 4.8.2源码中的FSFChangeLog.11文件: Wed Aug 7 14:10:07 1996 Jason Merrill * ginclude/stddef.h (NULL)
群友在微信群讨论的一个话题,有点意思,特拿出来分享一下。 输出true false 来看下面这段程序,和群友分享的大致一样。...首先来理解下宏变量: Java中,一个用final定义的变量,不管它是类型的变量,只要用final定义了并同时指定了初始值,并且这个初始值是在编译时就被确定下来的,那么这个final变量就是一个宏变量。...编译器会把程序所有用到该变量的地方直接替换成该变量的值,也就是说编译器能对宏变量进行宏替换。...final String a = "hello"; final String b = a; final String c = getHello(); a在编译期间就能确定下来,而b、c不行,所以a是宏变量...所以,再回到上面的程序,finalWorld2和finalWorld4是final定义的,也是在编译期间能确定下来的,所以它能被宏替换,编译器就会让finalWorld2和finalWorld4指向字符串池中缓存的字符串
简介: 宏是一种抽象(Abstraction),它根据一系列预定义的规则替换一定的文本模式。解释器或编译器在遇到宏时会自动进行这一模式替换。...4.宏函数 #define MAX( a, b) ( (a) > (b) ?(a) : (b) ) 比较常用的一个宏函数,封装后与函数的调用相同。...比如以上例子,当configs中的宏为y时,gpio_keys.c才会被编译。 6.'...#'字符串化 “#”的功能是将其后面的宏参数进行字符串化操作,简单说就是在对它所引用的宏变量,通过替换后在其左右各加上一个双引号。...比如下面代码中的宏: //来自:https://blog.csdn.net/leon1741/article/details/78149881 #define WARN_IF(EXP)
printf(STR(vck)); // 输出字符串"vck" printf("%d ", CONS(2,3)); // 2e3 输出:2000 return 0; } 二、当宏参数是另一个宏的时候... 需要注意的是凡宏定义里有用'#'或'##'的地方宏参数是不会再展开. 1, 非'#'和'##'的情况 #define TOW (2) #define MUL(a,b) (a*b) ...printf("%d*%d=%d ", TOW, TOW, MUL(TOW,TOW)); 这行的宏会被展开为: printf("%d*%d=%d ", (2), (2), ((2)*(...加多一层中间转换宏. 加这层宏的用意是把所有宏的参数在这层里全部展开, 那么在转换宏里的那一个宏(_STR)就能得到正确的宏参数. ...第二层: --> ___ANONYMOUS1(static int, _anonymous, 70); 第三层: --> static int _anonymous70; 即每次只能解开当前层的宏
聊聊Swift中的宏 宏,Macros是一种常见的编程技术,传统的C语言中,即包含了宏功能。宏这种功能,简单来说是在代码的预编译阶段进行静态替换,是一种非运行时的特性。...但宏的元编程能力可以大大的提高编程的灵活性和复用性,Swift在5.9版本中重新引入了宏功能,并且是以一种全新的方式来定义和实现宏,在提供灵活性的同时保证代码的安全性和可靠性。...但这也有一些缺陷,相比与C语言的宏,Swift中的宏的定义非常抽象,实现复杂,不太利于开发者进行理解。...Swift中的宏分为两类: 1 - 独立宏 2 - 附加宏 其中,独立宏单独出现,单独使用,不会附加到任何声明(可以理解为原始代码)上。附加宏则需要配合声明一起使用,通常是为了向原代码中增加一些功能。...这些宏因为是标准库中的,我们无法查看展开后的样子,如果是自定义宏则可以直接展开查看,后面我们再介绍。
大家好,又见面了,我是你们的朋友全栈君。...向前翻半页 ctrl + u(u就是up) 三.滑动一行 3.1 向前滑一行 ctrl+y 3.2 向后滑一行 ctrl +e zz 让光标所杂的行居屏幕中央...zt 让光标所杂的行居屏幕最上一行 t=top zb 让光标所杂的行居屏幕最下一行 b=bottom 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/137107.
宏中的x变量是一个表达式(用x:expr标记),所以在展开后它知道如何正确处理,会将其展开为((1 + 1) * (1 + 1))。 然而这只是书本上常见的宏的简单用法。...对于宏编程,Rust中提供了几种过程宏的库操作支持,即: 1、Syn 它是基于TokenStream的一种语法分析过程,它并不很强大,需要自定义扩展一些宏,比如Rust中的函数和闭包等。...过程宏(Procedure Macro)是Rust中的一种特殊形式的宏,它将提供比普通宏更强大的功能。方便起见,本文将Rust中由macro_rules!定义的宏称为规则宏以示区分。...属性宏(Attribute macro):用在结构体、字段、函数等地方,为其指定属性等功能。如标准库中的#[inline]、#[derive(...)]等都是属性宏。...在宏展开的过程中,遇到派生宏时,会将整个结构体(或enum、union)展开成TokenStream作为派生宏函数的输入,然后将其输出的TokenStream附加到结构体后面,再继续作语法分析。
整理了一些vim的set用法: 1.显示隐藏分隔符 set list 可以看到分隔符为制表符。 2.取消显示隐藏制表符 set nolist 3....显示行号 set nu 4.取消显示行号 set nonu image 5.设置只读 set readonly 6.指定tab缩进的字符数 set tabstop=4 # 设置为4个格 7.转换文件格式
向前翻半页 ctrl + u(u就是up) 三.滑动一行 3.1 向前滑一行 ctrl+y 3.2 向后滑一行 ctrl +e zz 让光标所杂的行居屏幕中央...zt 让光标所杂的行居屏幕最上一行 t=top zb 让光标所杂的行居屏幕最下一行 b=bottom
大家好,又见面了,我是你们的朋友全栈君。...整页翻页 ctrl-f ctrl-b f就是forword b就是backward 翻半页 ctrl-d ctlr-u d=down u=up 滚一行 ctrl-e ctrl-y zz 让光标所杂的行居屏幕中央...zt 让光标所杂的行居屏幕最上一行 t=top zb 让光标所杂的行居屏幕最下一行 b=bottom 转载于:https://www.cnblogs.com/orez88/articles/1867879
2,pydoc.vim 在vim中查找python文档,这个相当管用,你可以调用Pydoc ,也可以当光标停在某个关键词的位置时,按下K就能弹出文档,设置pydoc的执行路径如下,后面的路径和你的执行....vimrc中设置了 filetype plugin indent on 另外这个只支持python2.5以上的版本,这个比较坑爹 4,nerd_tree.vim vim中的文件浏览器,我做了一个映射...,但是vim版本必须是vim 7.2以上,另外支持自动补全比较好的就是pydiction.vim,比系统自带自动补全强大多了,支持tab补全,这家伙有3个组成部分。...vim-debug 这个依赖于系统的vim-debug模块,支持交互式调试,设置断点,跳出跳进函数,支持查看栈和变量,我的配置: " debugger keyboard shortcuts map <F5...中打开终端的功能,非常有用,可以vim buffer中执行python 命令(:ConqueTerm shell )也可执行bash命令(:ConqueTerm bash) 接下来,我们再来分析下.vimrc
本文主要解说vim中对文本的选择,vim中选择文本分为: (1)选择字符 ———— 命令行模式下输入小写v (2)选择行 ———— 命令行模式下输入大写V (3)选择块 ————...进入对应的选择模式 v / V / Ctrl+v; c. 用上下键选择文本;(v选择多个连续的字符,V选择连续的行,Ctrl+v选择对应的块) 假设要复制粘贴文本的话,继续进行下面步骤: d....移动光标至要拷贝的位置,输入p粘贴。
这一步骤是由预处理器(preprocessor)来完成的. 在源流程序被编译器处理之前, 预处理器首先对源程序中的"宏(macro)"进行处理....通过__VA_ARGS__来替换函数宏中的可变参数列表. 注意__VA_ARGS__只能用于函数宏中参数中包含有"..."的情况. e.g....printf(__VA_ARGS__) #endif tokens中的__VA_ARGS__被替换为函数宏定义中的"..."可变参数列表....应该避免重新定义函数宏, 不管是在预处理命令中还是C语句中, 最好对某个对象只有单一的定义. 在gcc中, 若宏出现了重定义, gcc会给出警告....并且字符串中的宏不会被识别 e.g.
vi 编辑器是所有 Unix 及 Linux 系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。...复制 「yw」:将光标所在之处到字尾的字符复制到缓冲区中。 「#yw」:复制#个字到缓冲区 「yy」:复制光标所在行到缓冲区。...A) 列出行号 「set nu」:输入「set nu」后,会在文件中的每一行前面列出行号。...B) 跳到文件中的某一行 「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字 15,再回车,就会跳到文章的第 15 行。...沈唁志|一个PHPer的成长之路! 原创文章采用CC BY-NC-SA 4.0协议进行许可,转载请注明:转载自:在Linux中vim的用法
DragonOS中实现了与Linux相似的READ_ONCE()宏以及WRITE_ONCE()宏,主要目的在于解决并行计算场景下,编译器错误的优化导致的数据访问错误的问题。...下面进行简单的介绍: 这两个宏主要是为了解决并行访问的问题的。编译器在优化代码的时候,会对一些操作进行重排序,或者删掉一些它认为无用的操作。...为了保证代码之间不乱序,我们可以使用READ_ONCE()和WRITE_ONCE()宏,告知编译器涉及到的操作之间不能乱序。...他们之间的区别 细心的小伙伴会发现:对于读取一个变量的值,好像这两个宏都能实现哦!对于这个问题,我们需要回到最开始的出发点:我们到底是要保护哪个操作不被乱序?...阅读这两个宏的源代码之后我们不难发现: // READ_ONCE能保证变量x的读取操作不被乱序,但不能确保对a[0]、a[1]的写入操作不乱序 a[0] = READ_ONCE(x); a[1] = READ_ONCE
在ReactiveCocoa 中,封装了很多非常实用的“宏”,使用这些“宏”为我们开发带来了很多的便利。 今天就来盘点一下RAC中的宏是如何实现的。...目录 1.关于宏 2.ReactiveCocoa 中的元宏 3.ReactiveCocoa 中常用的宏 一. 关于宏 宏(Macro),是一种批量处理的称谓。...ReactiveCocoa中的宏,如果不查看源码分析,会觉得那些宏都像魔法一样奇妙无比,接下来就来解开“宏”魔法的神秘面纱。 二. ReactiveCocoa 中的元宏 ?...在ReactiveCocoa的宏中,作者定义了这么一些基础的宏,作为“元宏”,它们是构成之后复杂宏的基础。在分析常用宏之前,必须要先分析清楚这些元宏的具体实现。...这两个在ReactiveCocoa中也是非常常见的宏,专门用在RACTuple中。 先看RACTuplePack(...)
c/c++ 宏中"#"和"##"的用法 一、一般用法 我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起....vck)); // 输出字符串"vck" printf("%d\n", CONS(2,3)); // 2e3 输出:2000 return 0; } 二、当宏参数是另一个宏的时候...需要注意的是凡宏定义里有用'#'或'##'的地方宏参数是不会再展开. 1, 非'#'和'##'的情况 #define TOW (2) #define MUL(a,b) (a*b) printf...("%d*%d=%d\n", TOW, TOW, MUL(TOW,TOW)); 这行的宏会被展开为: printf("%d*%d=%d\n", (2), (2), ((2)*(2))); MUL里的参数...加多一层中间转换宏. 加这层宏的用意是把所有宏的参数在这层里全部展开, 那么在转换宏里的那一个宏(_STR)就能得到正确的宏参数.
前言 从vue3开始vue引入了宏,比如defineProps、defineEmits等。我们每天写vue代码时都会使用到这些宏,但是你有没有思考过vue中的宏到底是什么?...然后执行render函数生成虚拟DOM,再调用浏览器的DOM API根据虚拟DOM生成真实DOM挂载到浏览器上。 vue3的宏是什么?...总结 现在我们能够回答前面提的三个问题了。 vue中的宏到底是什么?...vue3的宏是一种特殊的代码,在编译时会将这些特殊的代码转换为浏览器能够直接运行的指定代码,根据宏的功能不同,转换后的代码也不同。 为什么这些宏不需要手动从vue中import?...如果想要在vue中使用更多的宏,可以使用 vue macros。这个库是用于在vue中探索更多的宏和语法糖,作者是vue的团队成员 三咲智子 。
Python-mode 是一个 Vim 插件,它使你能够在 Vim 编辑器中更快的利用包括 pylint、rope、pydoc、pyflakes、pep8、autopep8、pep257 和 mccable...推荐阅读:如何用 Bash-Support 插件将 Vim 编辑器打造成编写 Bash 脚本的 IDE 这个插件包含了所有你在 Vim 编辑器中可以用来开发 Python 应用的特性。...Python 缩进 能够在 Vim 中运行 Python 代码 能够添加/删除断点 支持 Python 对象的 Vim 动作和操作符 能够在运行的同时检查代码(pylint、pyflakes、pylama...如何在 Linux 系统中为 Vim 安装 Python-mode 首先安装 Pathogen (它使得安装插件超级简单,并且运行文件位于私有目录中),从而更加容易的安装 Python-mode 运行下面的命令来获取...在本教程中,我向你们展示了如何在 Linux 中使用 Python-mode 来配置 Vim 。请记得通过下面的反馈表来和我们分享你的想法。
这就是我的方法,因为我需要为我的课程写论文,但我更喜欢呆在Linux中。...我从我们的“大Unix”校园计算机实验室得知,Unix系统提供了一组文本格式化的程序nroff和troff,它们是同一系统的不同接口:nroff生成纯文本输出,适用于屏幕或行式打印机,而troff产生非常优美的输出...在Linux上,nroff和troff被合并为GNUtroff,通常被称为groff。我很高兴看到早期的Linux发行版中包含了某个版本的groff,因此我着手学习如何使用它来编写课程论文。...我学到的第一个宏集是-me宏包,一个简单易学的宏集。 关于groff,首先要了解的是它根据一组宏来处理和格式化文本。宏通常是个两个字符的命令,它自己设置在一行上,并带有一个引导点。...宏可能包含一个或多个选项。当groff在处理文档时遇到这些宏中的一个时,它会自动对文本进行格式化。 下面,我将分享使用groff-me编写课程论文等简单文档的基础知识。
领取专属 10元无门槛券
手把手带您无忧上云