谁能找到一个__line__宏和__file line arg__宏的定义实现过程呀

C中宏定义_FILE_和_LINE_等使用 - 北京-小林-攻城狮 - 51Testing软件测试网 51Testing软件测试网-中国软件测试人的精神家园
本人生活在互联网,从事web测试工具,对互联网相关的业务及测试工具有非常高的兴趣,也有一定的经验。 有正在从事web测试工作或想从事此行业的测友们,欢迎与我联系,相互交流!测试交流QQ群:
C中宏定义_FILE_和_LINE_等使用
& 15:35:08
/ 个人分类:
&注意,是双下划线,而不是单下划线__FILE__ 包含当前程序文件名的字符串__LINE__
表示当前行号的整数__DATE__ 包含当前日期的字符串__STDC__
如果编译器遵循ANSI C标准,它就是个非零值__TIME__ 包含当前时间的字符串#include&stdio.h&int main (int argc,char argv){# printf("Hello,world\n");printf("Current File:%s,Include Function:%s,Date %s,%s,File Line:%d\n",__FILE__,__FUNCTION__, __DATE__,__TIME__,__LINE__);return 0;}执行结果Current File:test2.c,Include Function:main,Date Feb 17 :37,File Line:4宏的妙用,宏的妙用
C++中出了const关键字以后,宏定义常量的功能已经不在被推荐使用。这使得宏似乎没有了用武之地。实际上,宏还可以做很多事情,笔者也难以全部列举。这里,仅仅列举几个典型的用法,希望大家能够从中获益。
2、实现多环境兼容
常见的情况是,我们实现了一个函数,希望它只在某种编译条件满足是被编译和使用。例如,我希望在源码中插入调试语句,以便以Debug方式运行时能够通过调试信息观察程序运行情况。但是,在产品发售给用户时,我又希望这些调试信息不要输出,以降低代码尺寸,提高运行性能。这一问题的解决方法就是使用宏。根据条件编译指令,对于不同的编译条件,提供不同的实现。例如:我们希望在特定的位置向日志中写入当前行号和文件名,以判断对应代码是否被执行到,可以使用下面的宏:
#ifdef _DEBUG
#define TRACE_FILE_LINE_INFO() do{
str.Format(_T("file=%s,line=%urn",__FILE__,__LINE__);
CFile file("logfile.txt");
file.Write(str,str.GetLength());
#define TRACE_FILE_LINE_INFO()
#endif上面这段代码通过#ifdef #else #endif三个条件编译指令,根据_DEBUG定义情况(该宏用于区分DEBUG版本和Release版本),决定了具体的TRACE_FILE_LINE_INFO宏函数的实现。使用者可以用如下方法使用
TRACE_FILE_LINE_INFO();//这里显示行号和文本信息当然,采用其他方式也可以实现这一功能,但是使用宏有以下特殊好处: 只有需要的代码才会被编译,减少了符号表的尺寸,也减少了代码尺寸 宏在编译时被展开,因此用于表示代码位置的__FILE__,__LINE__宏可以起作用,如果用函数实现,这两个宏则不能起作用。
3、用新函数替换原有函数
对于一个设计好的函数,假设它已经在一个很大的工程中到处使用,突然发现它的一个不足,想修改它的功能。也许这个新增加的功能需要一个额外的参数,但是又不想修改使用这些函数的地方。假设有两个函数必须成对使用,一个占用资源并使用,另外一个则释放资源以供其他模块使用。典型的例子是,函数一(假设为Lock)获得一个全局的锁,这个锁用于保护在多线程情况下多个线程对一个公共资源如一个全局变量的访问。问题是,这个Lock函数获得锁以后,其他线程将不能再获得这个锁,直到当前线程释放这个锁。编制Lock函数的程序员同时提供了一个 Unlock函数用于释放锁,并要求使用Lock的人必须对应的使用Unlock。调试程序时,发现线程被死锁,怀疑有人使用完Lock后忘记调用 Unlock,但是Lock和Unlock在这个大工程中都被广泛的使用,因此设计者希望Lock和Unlock都增加两个额外的参数file和line,以说明这两个函数在哪里被调用了,哪些地方被死锁以及哪些地方调用了Lock但是没有调用Unlock。假设这两个函数的原型为:
void Lock();
void Unlock();新设计的函数的原型是:
void Lock(LPCTSTR szFileName,UINT uLineNo);
void Unlock(LPCTSTR szFileName,UINT uLineNo);设计完新的函数后,项目经理希望所有模块统一使用这两个函数并提供文件名和行号信息作为参数。这样将是一个非常浩大且烦琐的工作,意味着重复性的劳动、数小时无聊的加班和工期的延误,这是谁都不愿意遇到的。使用宏可以非常轻松的解决这一切。首先,应该把新设计的函数换个名字,不妨叫它们NewLock和NewUnlock,也就是他们的原型为:
void NewLock(LPCTSTR szFileName,UINT uLineNo);
void NewUnlock(LPCTSTR szFileName,UINT uLineNo);这个函数原型应该放在一个头文件中,避免在多个地方重复的声明。需要用到这两个函数的cpp文件,只要包含他们原型所在的头文件即可。为了不改动使用Lock/Unlock函数的模块,在头文件中增加如下两行:
#define Lock() NewLock(__FILE__,__LINE__)
#define Unlock() NewUnlock(__FILE,__LINE__)这样,当不同模块使用这个函数时,宏替换功能在编译时起作用,自动使用了__FILE__和__LINE__为参数,调用了新设计的函数。调试的时候就可以根据日志来判断什么地方遗漏了调用Unlock。
4、给一个函数捆绑其他功能
上述方法修改了原来函数的设计。实际上,这两
来源:/n/5903.html
热门搜索:
PS图片 为美女添加水蓝色效果教程
网页图片不能显示怎么办
使用Excel2010截图方法
怎样使用Excel2010
PS后期处理 将可爱小孩场景去黄
因为对于孩子来说,自闭症是影响一生的疾病,所以很多父母对于自闭症会有一下了解,但是父母对于自闭症的危害却不是非常了解,下面就给父母们介绍一下自闭症对于孩子有哪些危害。
自闭症对于孩子来说是一种非常恐怖的心理疾病,这种疾病若是不及时治疗会影响孩子一辈子,但是很多人没有发觉到自闭症孩子的一些异常,下面就给大家介绍一下自闭症的症状。
随着人们年龄的增长,冠心病的患病率的几率越来越高,很多人知道了自己冠心病,只不过很多人不知道怎么调养,下面就给各位详细的介绍一下冠心病应该注意哪些问题。
随着人们的医疗知识的普及,现在一到暑假的时候,医院里面一个医生一天割包皮要割几十个,但是,很多人想让自己尽快恢复过来,这就要靠调养了,下面就给大家介绍一下包皮术后的调养。
微博是我们现在相当流行的社交软件,现在大家也很喜欢用表情包进行交流,也已经成为了一种流行文化。最近微博也出了一组很可爱的表情包,下面就给大家来介绍微博新出的表情有哪些吧。
今日北京时间凌晨苹果召开新品发布会,iPhone 7和iPhone 7 Plus正式登台亮相,中国在首发之列,iPhone7起售价为5388元,iPhone7 Plus起售价为6388元,iphone7各项性能创新升级也让那些果粉们早就跃跃欲试了吧,而此次中国大陆的iPhone 7/7 Plus将在9月9日下午3:01正式开启预售,9月16日将正式开卖。现在万事俱备,只欠“割肾”,果粉们,Are you ready?
火影是笔者非常喜欢的一个动漫,同时火影的游戏也有很高的可玩性,对于新手玩家首先要了解火影忍者究极风暴3出招表,下面我就来教大家这款游戏里一些招式,喜欢这个游戏的玩家不妨来看看。
肚子上的赘肉看上去让人烦恼,尤其是对于想穿裙子的女生来说更是一件郁闷的事情。现在减肥的方法有很多,但是很多人并不知道专门瘦肚子的方法。那么,如何瘦肚子呢?下面就给大家介绍几种减肚子的方法吧。
炎夏烈日炎炎,就在你与阳光亲密接触时,也让紫外线有了可乘之机,有的时候,虽然你认真做了防晒的工作,却依旧没能躲过炙热的阳光,晒伤之后,要立马着手修复晒伤的肌肤,那么晒伤后怎么处理呢?下面就一起来看看吧。
脸上肉嘟嘟的女生和男生们是不是选择发型的时候很伤大脑。没关系,我们这里肯定有一款适合你的发型,本文也是大圆脸一枚,下面分享下我收集多年的圆脸女生男生发型以及学会的圆脸发型修饰技巧。
如果您有什么好的建议或者疑问,可以联系我们! QQ群: QQ号: 进群、加好友,备注:图老师 小周老师一一为您解答!让我们一起学习、一起进步 版权所有 (C) 2016 All Rights Reserved. 湘ICP备号
微信公众号

我要回帖

更多关于 什么是宏定义 的文章

 

随机推荐