[C++语法语义探讨] Directive #Line
bigpanda
2006-12-04
Directive #Line 是用来改这两个宏的吧, __LINE__, __FILE__.
请问在什么时候有需要修改这两个宏? |
|
jack
2006-12-04
? 为啥要改这两个宏?一般都是用来做output信息用的,你想改成什么样的
|
|
qiezi
2006-12-05
有时候为了更好地输出信息,是要这么做的,C/C++的预处理程序就这么做,不然根本不能正确提示出错或警告的文件和行数,因为宏展开以及头文件包含以后,文件和行数都会变化,如果你用GCC编译器的话,用-E开关去编译源文件,查看它生成的代码吧。
如果你自己做预处理程序,比如自己做IDL的预处理器,可以生成这些代码,更好地提示错误。 |
|
jack
2006-12-05
这两个宏平时从来不用。不过必须写成宏,才能够正确输出行数。宏可以做代码展开.
不过最近在使用ACE的时候,ACE到是有输出行数信息的log开关。有的时候也蛮方便的。 #define ACE_DEBUG(X) \ do { \ int __ace_error = ACE_Log_Msg::last_error_adapter (); \ ACE_Log_Msg *ace___ = ACE_Log_Msg::instance (); \ ace___->conditional_set (__FILE__, __LINE__, 0, __ace_error); \ ace___->log X; \ } while (0) 给你提供个参考 |
|
Elminster
2006-12-11
说起这个 __FILE__ 和 __LINE__ 啊,想起一件 BT 事 ……
(严正声明:以下纯属 BT 歪招,小朋友们在家里千万不要学啊! ![]() 好几年前有一阵子需要研究遗留代码,没文档没注释,也没有单步调试器可以用,其中痛苦可想而知,于是就琢磨着能不能用 #define 来把 { 给全部替换成 {begin_trace(__FILE__,__LINE__); ,把 } 给全部替换成 end_trace(__FILE__,__LINE__);} ,这样不就有 stack trace 了么 …… 可惜仔细一琢磨,不行: 1、#define 貌似只能替换 identifier,前后大括号这种不行。 2、就算行,这 "Here is a }, haha" 之类的字符串也挂了。 3、就算字符串不挂,结构定义类定义,数组字面初始化也挂了。 4、而且 for/while/if 都用前后大括号对,干扰信息太多。 5、(特别声明,这一句尤其属于 BT 恶搞)最后也是最重要的,身为 Bjarne 教主的忠实粉丝,对预处理器和宏这种堕落的东西,应该必欲除之而后快呀! 后来就开始恶搞起来了,考虑要是能够把 { 和 } 当成一个可以重载的操作符,不就能解决这个问题了么?后来还打算学习 Bjarne 教主当年那篇愚人节文章“重载空白操作符”的笔法,写一篇“重载{ 和 } 操作符”,呵呵。可惜后来人越来越懒了,一直拖到今天也没动笔 ………… |
|
fixopen
2007-11-23
如果我们仅仅采用单一的C语言本身,并不需要#line,但是如果我们采用多语言协作编程,比如:我就记得有一种情况可以把SQL和C混合在一起使用,有这么一个编程环境,当然现在不再流行了。在这种环境下,#line的作用就很明显了。因为,像这种混合语言编程环境,一般都有一个预编译器,把寄宿语言翻译成C这种寄主语言,而翻译过程会导致我们的代码行数发生变化,这时候编译器给我们报告那一行出现问题了之类的情况,就会导致我们不知所云,因为那个行数不是我们在实际代码中看到的行数。
另外,如果采用不同级别的编程,也就是说,采用各种生成式编程【比如:lex和yacc等】方式的时候,也需要使用#line来规定文件名和行数。 |
相关讨论
相关资源推荐
- angular-line-links-directive
- [Error] invalid preprocessing directive #inclued问题解决
- matlab line指令_#line指令示例| C预处理程序
- The #line directive
- 【转载】C语言在编译过程中常见的error或warning
- Preprocessor directives #define, #undef
- 解决“extra tokens at end of #include directive”警告
- 缺少模板文件 list.html,Jfinal 3.0 如何配置不适用模板引擎
- angular-chartjs-line-directive:Chart.js Line 的 AngularJS 指令
- GCC 常见错误解析