首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

有没有人曾经使用__COUNTER__预处理器宏?

在编程中,__COUNTER__预处理器宏是一个特殊的宏,它在编译时为每个翻译单元生成一个唯一的整数值。这个宏常用于生成唯一的标识符,例如在编译时为变量、函数或类模板生成唯一名称。

在C++中,__COUNTER__宏是从0开始递增的,并且在一个编译单元中是独立的。这意味着,如果在多个源文件中使用__COUNTER__,每个源文件中的计数都是独立的。

例如,在一个项目中,你可以使用__COUNTER__生成唯一的标识符:

代码语言:cpp
复制
#include<iostream>

#define UNIQUE_NAME(prefix)  prefix ## __COUNTER__

int main() {
    int UNIQUE_NAME(test_var) = 42;
    std::cout << "test_var value: "<< test_var<< std::endl;
    return 0;
}

在这个例子中,__COUNTER__宏将为test_var生成一个唯一的名称,例如test_var0

需要注意的是,__COUNTER__宏是非标准的,并且在某些编译器中可能不被支持。在使用__COUNTER__之前,请确保你的编译器支持这个宏。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【为正名】什么?我忘了去上“数学必修课”!

简而言之,通过所确定的内容是在编译时刻就固化下来的。很多人都了解这一点,也很擅长使用的方式来固化一些常数,比如,教科书中最常见的一个例子是: //!...【序号自增】 ---- 定义和使用的时候,我们也许会突发奇想,能不能让使用的数字实现“序号自增”的效果呢?...__的基本特性:每次使用__COUNTER__它的值都会增加1——换句话说,在你使用 ADD_ITEM_TO() 的时候,如何才能确保 __COUNTER__是从0开始编号的呢?...——别的可能已经使用过它了。 要解决这一问题,我们就不得不借助的“好基友”——枚举的帮助了。...基本思路是这样的: 无论 __COUNTER__ 是什么值,我们都可以将其传递给一个枚举——作为初始值; 使用 __COUNTER__ 时,我们首先通过枚举将初始值扣除,从而获得“从0开始的计数” 说干就干

65620

玩转iOS“定义”

本篇博客,总结了前辈的经验,同时收集了一些编写非常巧妙的进行分析,希望可以帮助大家对定义更加深刻的理解,并且可以将心得应用于实际开发中。...,首先__COUNTER__在每次替换时都会进行自增,##是一种中专用的特殊符号,用来将参数拼接到一起,但是需要注意,使用##符号拼接的如果是另外一个,则其会阻止的展开,因此我们定义了一个转换...) \ do {NSLog(@"自定义的信息"); \ NSLog(format, ##__VA_ARGS__);} while(0); 五、特殊的符号与常用内置       几个特殊的符号可以让定义变得非常灵活...__COUNTER__       一个累加计数,常用来构造唯一变量名。 __LINE__       记录LOG信息时,常用的一个内置,预编译时会将其替换为当前的行号。...#endif 其中__NSMAX_IMPL__借助计数__COUNTER__和拼接__NSX_PASTE__来构造唯一的内部变量名,我们前面提供的示例的写法也基本是参照这个系统来的。

3.4K11

C++内置定义

【注】__func__ 和 __FUNCTION__ 本质上都不是,因为预处理器并不知道当前处理的函数名。 __DATE__:字符串格式,指示预处理器处理当前代码时的日期。...__cplusplus:当使用了 C++ 编译器时,该被定义。因此可以它来测试编译时使用的编译器是 C 编译器还是 C++ 编译器。...__ASSEMBLER__:当预处理汇编语言时,该被定义。 2. 公共内置定义 公共内置定义是 GNU C 的扩展,只要使用了 GNU C 或者 GNU Fortran,这些都是可使用的。...公共内置定义数量繁多,因此仅介绍常用的一些,更多可以参见官方文档:Common Predefined Macros __COUNTER__:累加器,每次使用一次就递增 1。...因此可以用来当作唯一标识符使用。 __GNUC__、__GNUC_MINOR__、__GNUC_PATCHLEVEL__:这些使用了 C 预处理器的所有编译器中都定义了。

1.7K20

避免这7个误区,才能让【】削铁如泥

我们知道所有定义都将被重新扫描以查找更多要替换的,如果自引用被认为是使用,它将产生无限大的扩展。 为防止这种情况,自引用不被视为调用。它原样传递到预处理器输出中。...实际上,每当在运行文本中使用处理器时,预处理器都会将其单独保留。 如果x扩展为使用y,而y的扩展引用了x,则这是x的间接自引用。...参数扫描处理 参数在被替换为主体之前必须经过完全扩展,替换后,将再次扫描整个主体,包括替换的参数,以查找要扩展的。...如果按照给定的方式替换了参数,并且没有进行扫描,则剩余的单个扫描将找到相同的调用并产生相同的结果。 扫描处理在以下三种特殊情况下有大的作用。...扫描会导致发生预期的结果。 如果没有扫描,f(1)本身将被替换为参数,并且f的内部使用将在主扫描期间作为间接自引用出现,并且不会扩展。

1.2K20

iOS中的预编译指令的初步探究

,他们肯定跟你说过#include “”、#include 的区别,他们肯定说过#include“xxx”包含和使用#include 包含的不同之处就是使用包含时,预处理器会搜索C函数库头文件路径下的文件...其实__COUNTER__是一个预定义的,这个值在编译过程中将从0开始计数,每次被调用时加1。因为唯一性,所以很多时候被用来构造独立的变量名称。了上面的基础,再来看最后的实现就很简单了。...和刚才的__COUNTER__类似,预定义的行为是由编译器指定的。...如果你手边Xcode,也可以看看Cocoa中真正的NSLog方法的实现,可以看到它也是接收一个格式参数和一个参数列表的形式,我们在里这么定义,正是为了其传入正确合适的参数,从而保证使用者可以按照原来的方式正确使用这个...作为一个您读到了这里的小奖励,附送三个debug输出rect,size和point的,希望您能用上(嗯..想想曾经多少次你需要打印这些结构体的某个数字而被折磨致死,让它们玩儿蛋去吧!

2.2K80

Objective-C中的预处理器指令与

引 什么是预处理器,跟我什么关系? 预处理器是在OC源文件编译过程中的一个部分,而且是第一个处理部分,预处理器也由此可见。...什么区别?那些不太熟的又是干什么的呢?我们一个个来看。 除了上述的指令外,还有一个老熟人也属于预处理器的范畴,下文再来说。...预处理器 要知道,也是预处理器范畴内的内容,我们用的也很多: // 定义常量值 #define 名 值 //定义函数 #define 名(参数) 代码 // 移除 #undef 被定义后...如果函数多个参数,用逗号分隔开。 定义函数的时候,一个细节要注意,就是要多对参数使用括号: #defind SQUARE(x) ((x) * (x)) 为什么要这么麻烦?...此外,如果你的代码多行,还应该使用大括号括起来: #define FUNC(a, b) {a = a + b; b = a - b;} 此外,不要过度使用

67230

校长讲堂第十讲

处理器 运行的程序并不是我们所写的程序:因为 C 预处理器首先对其进行了转换。出于两个主要原因(和很多次要原因),预处理器为我们提供了一些简化的途径。...例如,putchar()和 getchar()通常实现为以避免对每一个字符的输入输出都要进行函数调用。 6.1 不是函数 由于可以象函数那样出现,有些程序员有时就会将它们视为等价的。...注意第一个参数完全可以使用如*z++之类的东西,尽管它在中两次出现,但只会被求值一次。...例如,没有人能正确处理 putc(*c++, f)。另一个例子,考虑很多 C 库中出现的 toupper()函数。它将一个小写字母转换为相应的大写字母,而其它字符不变。...另一个需要注意的地方是使用可能会产生巨大的表达式。例如,继续考虑 max()的定义: #define max(a, b) ((a) > (b) ?

33361

存储核心架构瓶颈已被攻破

以往存储系统多采用专用处理器芯片,即所谓的ASIC芯片,国际存储大厂也曾经采用AS400作为“机头”,ASIC的特点是针对数据存储处理定制、优化,在性能、功能上有优势。...信创“换芯”自主知识产权是关键 谈到信创“换芯”,杉科技市场部副总裁郑雪峰表示:对于信创,很多关注在国产CPU处理器和国产操作系统,但对于信创存储而言,更加重要的是核心原代码是不是自主可控,是不是拥有整套知识产权...X86和飞腾ARM处理器。”...据了解,如今主流信创架构芯片存在多种技术路线,x86、MIPS,也有ARM体系,且大多数芯片更专注计算市场,对于外部存储关注不够,典型的如PCIe外部连接通道的数量,不能够满足信创存储的需要。...要发挥信创芯片的能力,同时也要弥补信创芯片的不足,这是杉科技的考验。汪振浩透露:对于ARM架构处理器,如对华为鲲鹏处理器的支持,杉科技也在积极布局之中。

40910

戴君毅: Linus都要再三修正的max()是怎样演变的

本篇对max()的全面梳理,我看完第一稿,以为是老手所为,实际上,也是菜鸟戴同学从旁观者给梁同学的一臂之力,使得整个的max()的分析和演变了一个完满的结局。"...ps:小编也是刚接触Linux内核的小白,如果有问题希望大家留言指正~ 想必大家对老版本内核中的max()已经了深刻印象:前面的文章已经详细地说明了一个max是如何从 #define max(x...PASTE(a,b) ___PASTE(a,b) #define __UNIQUE_ID(prefix) __PASTE \ (__PASTE(__UNIQUE_ID_, prefix), __COUNTER...(这个关子卖的真是僵硬,上一篇大家都见识过了最新版本的max()了嘛,肯定知道介个并不是最新版本的max()啦) 了解过GNU C的同学应该知道一个变长数组(VLA)这种神奇的存在,VLA在运行时其长度是不确定的...从此,_UNIQUE_ID()这个使用需要变得谨慎,当然,max()也需要重写。 所以,最新的max()应运而生。

63430

C++内联函数

唯一不同之处在于内联函数会在适当的地方像预定义 一样展开,所以不需要函数调用的开销。因此应该不使用使用内联函数。 在普通函数(非成员函数)函数前面加上inline关键字使之成为内联函数。...仅仅是声明函数 inline void func(int a); 应该用下面的写法  inline int func(int a){ return ++; } 注意: 编译器将会检查函数参数列表使用是否正确...这些事 处理器无法完成的。 内联函数的确占用空间,但是内联函数相对于普通函数的优势只是省去了函数调用时候的压 栈,跳转,返回的开销。我们可以理解为内联函数是以空间换时间。...二、函数和内联函数区别 函数的替换是发生在预处理阶段 内联函数的替换是发生在编译阶段 函数容易出错,但是内联函数不会 我们希望的是 c = (10 +20 )* 5,但是用函数出现的却会为...类型检查和类型转换、包括在合适位置放入对象this指针这些都是预处理器不能完成的。

1.1K40

李彦成为首登《时代周刊》的互联网大佬,百度研究院再添三名大牛

北京时间1月19日,百度创始人李彦登上最新一期《时代周刊》(亚洲版)的封面,人物照片旁一个赫然的标签:“创新者”,特写文章的标题为《百度李彦正帮助中国赢得 21 世纪》(《Baidu's Robin...而在中国,没有人比李彦更重视这个挑战。根据公布的报告,2017年前三季度百度公司的90亿美元收入中,约有12亿美元被重新投入研发。...自动驾驶的发展可能会让1600万中国卡车司机失去工作,当被问及如何看待此类问题时,李彦表示,这个问题是不可避免的,我们可以做的是不断创新,为人们创造更多的新工作。...没有人会再问李彦在中国是否电脑的存在了。 事实上,曾经的中国是一个“廉价盗版”的土地,而如今中国企业的发展已经让硅谷的众多公司巨头坐立不安了。...在中国,没有人比李彦更重视这个挑战。根据公布的报告,2017年前三季度百度公司的90亿美元收入中,约有12亿美元被重新投入研发。他认为,百度可以利用中国最大的优势:规模来主导全球的人工智能市场。

735100

pause 指令与 rep;nop

/rep result = 0 a b c d e result = 5 上面程序中, movstr() 用来演示一般的 rep 前缀的使用方式,这里用一段内联汇编将数组...但在执行完 movstr() 后,它变为 0 ,这个值是通过 ecx 寄存器传递过去的,因为正是使用了 rep 前缀,到复制最后,ecx 的值就会减为 0 。接着,我们执行 nops() 。...这样就可以大大的提高了处理器的性能。正是基于此,才建议在 spin-wait loops 中使用 pasuse 指令。...在等待资源而执行自旋锁等待时,Pentium4 处理器以极快的速度执行自旋等待时,将会消耗很多电能, 但使用 pause 指令则可以极大的减少处理器的电能消耗。...Pentium4 处理器以一种 延迟(pre-defined delay)的技术来实现 PAUSE 指令。这种延迟也是有限度的,并且在一些处理器上是零延迟。

1.9K20

【嵌入式开发】ARM 异常向量表 ( 异常概念 | 异常处理流程 | 异常向量 | 汇编代码 )

, 突然 按下重启键, 就会触发该异常; 2.Undefined instructions : 处理器无法识别指令的异常, 处理器执行的指令是规范的, 如果 尝试执行 不符合要求的指令, 就会进入到该异常指令对应的地址中...memory abort) : 取指令失败, ARM 在执行指令的过程中, 要先去取指令准备执行, 如果取指令失败, 就会产生该异常; 5.Data Abort (data access memory...; 使用 普通 向量 还是 高位向量, 可以使用 CP15 协处理器进行配置; 3.异常 与 地址 一一对应 : 每个异常都对应着一个地址, 出现指定类型的异常时, 就会跳转到该异常对应的地址执行异常处理程序....text 指明汇编代码段; 4.标明程序入口标号 : 先使用 .global _start 将 _start 声明成全局符号; 使用 _start: 标明程序的入口标号是 _start; 5....链接器脚本 ---- gboot.lds 链接器脚本 代码解析 : 1.指明输出格式 ( 处理器架构 ) : 使用 OUTPUT_ARCH(架构名称) 指明输出格式, 即处理器的架构, 这里是 arm

3.5K10

Boost Lockfree「建议收藏」

但是,绝对的carefree是不可能的,你不care别人,也没有人会care你。  我曾经犯过把“free”当成“自由”来理解的错误。...一次吃盖浇饭碰到一个美国人,我跟他搭讪,说:“美国是一个free的国家。”他没听听懂,问:“什么free?”我一开始心想他连美国精神都不知道,但马上反应过来了,赶紧加了一句:“free去干很多事。”...为了最大限度的挖掘并行编程的性能考虑使用与锁无关的数据结构来编程 与锁无关的数据结构不是依赖于锁和互斥来确保线程安全。...Lockfree的重要操作就是CAS(Compare And Set)原子操作 原子操作就是多个线程访问同一个资源时,且仅有唯一 一个线程对该资源进行操作 BOOST中的定义 BOOST_ATOMIC_DETAIL_X86...ptr_mask = 0xffffffffffffUL; //(1L<<48L)-1; ...... } #else #error unsupported platform #endif 早期X86-64处理器不支持

30420

滴滴前端一面必会面试题汇总

懒加载对服务器前端一定的缓解压力作用,加载则会增加服务器前端压力。...我了解的加载的最常用的方式是使用 js 中的 image 对象,通过为 image 对象来设置 scr 属性,来实现图片的加载。CSS预处理器/后处理器是什么?为什么要使用它们?...,setImmediate ,I/O ,UI rendering很多人个误区,认为微任务快于任务,其实是错误的。...所以正确的一次 Event loop 顺序是这样的执行同步代码,这属于任务执行栈为空,查询是否微任务需要执行执行所有微任务必要的话渲染 UI然后开始下一轮 Event loop,执行任务中的异步代码通过上述的...Event loop 顺序可知,如果任务中的异步代码大量的计算并且需要操作 DOM 的话,为了更快的 界面响应,我们可以把操作 DOM 放入微任务中。

45120

李彦首登《时代周刊》,称百度将主导全球人工智能产业 | 内附专访内容

以下是该篇文章的部分内容 “百度李彦正在帮助中国引领21世纪风潮。” 1992年,李彦还是一个在美国申请计算机图形学研究生课程,并在被美国教授询问他“是否计算机”时哑口无言的一个中国学生。...而在中国,没有人比李彦更重视人工智能了。从百度公布的2017年财报看,该公司2017年前三季度总收入共计90亿美元,其中有12亿美元被用于AI研发。...“我们的愿景是,让人类可以使用人类的语言与所有设备进行交互。”李彦说:“人类和动物之间的区别就在于人类可以使用工具。在过去十万年里,无论你发明了什么工具,你都必须学习如何使用。...而在人工智能时代,你将不必去学习如何使用工具,因为工具会自动理解人类的需求并提供相应的服务。这就是未来。“ 然而,技术不仅会给我们带来回报,也会带来惊人的风险。...特斯拉创始人&CEO伊隆·马斯克就曾经说过,人类根本无法控制AI,让其不对人类构成威胁。而霍金也一直认为,AI的发展会导致世界末日。 “我不认可这样的说法,因为人类是能力维持世界和平的。

42740

6小时完成芯片布局,谷歌用强化学习助力芯片设计

比如,训练策略有机地确定了一种布局:将放置在芯片的边缘附近,将标准单元放置在芯片中心的凸起空间。这将导致和标准单元之间的线长变短,不会带来过度的布线拥塞。...开源 RISC-V 处理器 Ariane 的布局随着训练进程的变化情况。左图中策略是从头开始训练的,而右图中使用训练策略对芯片进行微调。每个矩形代表一个单独的布局。...注意,从头开始的策略发现的空洞在一开始就存在于训练策略的布局中的。 研究者观察到训练使得样本效率和布局质量均有所提升。...该研究对比了使用训练策略生成的芯片布局质量和从头开始训练策略得到的布局质量。...为了为之前未见过的芯片 block 生成芯片布局,研究者使用了 zero-shot 方法,即只使用训练策略(不进行微调)来放置新的 block,并在不到一秒的时间内完成了布局。

72920

记录visual Studio使用过程中的两个问题

曾经说过不太喜欢QCreator来开发Qt应用,因为在程序编译出错时,QCreator的提示非常不友好。不知道QCreator经过了数个版本的发展,现在是否改进。...因为可能其他的项目已经新建过了命名为“x64”的“平台”了。这个时候再新建的话就会产生冲突。要解决冲突的话,把红框中的选项取消掉即可。 ?      ...因此,有些属性需要根据情况修改(如预处理器定义)。 Unicode字符集       Unicode字符集也是VS工程的一个属性,指定在该项目中使用什么样的字符集。...尽管我辣么明显的加上了TEXT,VS仍然提示我参数类型不对!前思后想一番突然想到,难道是项目字符集的问题?不然的话加了TEXT应该会有效果啊!于是打开项目属性页面看看,果然: ?      ...于是当机立断将其设置为“使用Unicode字符集”: ?       保存一看,错误已经消失的无影无踪……可见,正确的设置好项目的字符集编码,对于TEXT正常工作还是非常重要的。

1.1K100

【C语言】什么是定义?(#define详解)

一旦预处理器在程序中找到的示实例后,就会用替换体代替该. 从变成最终替换文本的过程称为展开. 注意,可以在#define行使用标准C注释.每条注释在预处理后都会被一个空格代替....当然,定义还可以包含其他(一些编译器不支持这种嵌套功能),比如: #define X 3 #define Y 5 #define MAX(X,Y) X>Y?...一般而言,预处理器发现程序中的后,会用等价的替换文本进行替换,如果替换的字符串中还包含,则继续替换这些....__a : __b; }) 五.类函数与函数的对比 类函数的调用看上去和函数调用相同,那么这两者何区别呢?...表达式的求值结果更容易 测。 带 副 作 用 的 参 数 参数可能被替换到体中的多个位置,所以带有副作 用的参数求值可能会产生不可预料的结果。

20410
领券