﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-日日勤作息-随笔分类-编译器设计</title><link>http://www.cppblog.com/zealsoft/category/3371.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 16 Oct 2008 02:16:28 GMT</lastBuildDate><pubDate>Thu, 16 Oct 2008 02:16:28 GMT</pubDate><ttl>60</ttl><item><title>如何编写Google CTemplate的Modifier </title><link>http://www.cppblog.com/zealsoft/archive/2008/10/15/64066.html</link><dc:creator>zealsoft</dc:creator><author>zealsoft</author><pubDate>Wed, 15 Oct 2008 14:03:00 GMT</pubDate><guid>http://www.cppblog.com/zealsoft/archive/2008/10/15/64066.html</guid><wfw:comment>http://www.cppblog.com/zealsoft/comments/64066.html</wfw:comment><comments>http://www.cppblog.com/zealsoft/archive/2008/10/15/64066.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zealsoft/comments/commentRss/64066.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zealsoft/services/trackbacks/64066.html</trackback:ping><description><![CDATA[<p>Google CTemplate<span style="FONT-FAMILY: 宋体">提供了调节器</span>(Modifier)<span style="FONT-FAMILY: 宋体">功能。所谓调节器，类似于在模板中可以使用的用户自定义函数，也就是对于相同的数据字典内容，模板中使用不同的调节器就可以显示不同的内容。</span></p>
<p><span style="FONT-FAMILY: 宋体">要编写一个调节器，需要从<font face=Verdana>template_modifiers::TemplateModifier</font>派生一个类：</span><span style="FONT-FAMILY: 宋体"></p>
<div class=cnblogs_code><img id=Code_Closed_Image_220142 style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_220142').style.display='none'; document.getElementById('Code_Open_Image_220142').style.display='inline'; document.getElementById('Code_Open_Text_220142').style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><img id=Code_Open_Image_220142 style="DISPLAY: inline" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_220142').style.display='none'; getElementById('Code_Closed_Image_220142').style.display='inline'; getElementById('Code_Closed_Text_220142').style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><span class=cnblogs_code_Collapse id=Code_Closed_Text_220142 style="DISPLAY: none">Code</span><span id=Code_Open_Text_220142 style="DISPLAY: inline"><br><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;BitStringModifier&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;template_modifiers::TemplateModifier&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Modify(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">,&nbsp;size_t&nbsp;inlen,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;ctemplate::PerExpandData</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;per_expand_data,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExpandEmitter</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;outbuf,&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;arg)&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">;<br>};<br></span></span></div>
<p></span><font face=Georgia>BitString </font><span style="FONT-FAMILY: 宋体">调节器的作用是将数值型数据转换为二进制字符串显示。其在模板中的使用如下所示：</span></p>
<p style="TEXT-INDENT: 18pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">bstr = bstr + '{{item_type3id:x-bitstring=4}}'b;</span></p>
<p><span style="FONT-FAMILY: 宋体">用户自定义的调节器一般采用&#8220;</span>x-<span style="FONT-FAMILY: 宋体">&#8221;开头。调节器可以带有用户参数，例如上例的&#8220;</span>=4<span style="FONT-FAMILY: 宋体">&#8221;就是用户参数，表示生成的二进制串的长度为</span>4<span style="FONT-FAMILY: 宋体">，如果不足</span>4<span style="FONT-FAMILY: 宋体">位，前面自动补</span>0<span style="FONT-FAMILY: 宋体">。</span><span style="FONT-FAMILY: 宋体"></p>
<p></span><span style="FONT-FAMILY: 宋体">调节器的主要功能是在</span><font face=Georgia>Modify</font><span style="FONT-FAMILY: 宋体">函数中实现的，在该函数中调用</span><font face=Georgia>outbuf-&gt;Emit</font><span style="FONT-FAMILY: 宋体">函数来输出所需要的结果。</span></p>
<p><span style="FONT-FAMILY: 宋体"></p>
<div class=cnblogs_code><img id=Code_Closed_Image_215515 style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_215515').style.display='none'; document.getElementById('Code_Open_Image_215515').style.display='inline'; document.getElementById('Code_Open_Text_215515').style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><img id=Code_Open_Image_215515 style="DISPLAY: inline" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_215515').style.display='none'; getElementById('Code_Closed_Image_215515').style.display='inline'; getElementById('Code_Closed_Text_215515').style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><span class=cnblogs_code_Collapse id=Code_Closed_Text_215515 style="DISPLAY: none">Code</span><span id=Code_Open_Text_215515 style="DISPLAY: inline"><br><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;BitStringModifier::Modify(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">,&nbsp;size_t&nbsp;inlen,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;ctemplate::PerExpandData</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;per_expand_data,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExpandEmitter</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;outbuf,&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;arg)&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;atoi(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">,&nbsp;inlen).c_str());<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;len&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;atoi(arg.c_str()&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800080">1</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;sID&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;itoa(x,&nbsp;</span><span style="COLOR: #800080">2</span><span style="COLOR: #000000">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(sID.size()&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;len)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sID&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">0</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;sID;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;outbuf</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Emit(sID);<br>}</span></span></div>
<p>&nbsp;</p>
<p>要在程序中支持调节器，还需要调用</span><font face=Georgia>google::template_modifiers::AddModifier</font><span style="FONT-FAMILY: 宋体">函数添加</span><font face=Georgia>BitStringModifier</font><span style="FONT-FAMILY: 宋体">的实例。如：</span><span style="FONT-FAMILY: 宋体"><font face=Verdana></p>
<div class=cnblogs_code><img id=Code_Closed_Image_215714 style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_215714').style.display='none'; document.getElementById('Code_Open_Image_215714').style.display='inline'; document.getElementById('Code_Open_Text_215714').style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><img id=Code_Open_Image_215714 style="DISPLAY: inline" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_215714').style.display='none'; getElementById('Code_Closed_Image_215714').style.display='inline'; getElementById('Code_Closed_Text_215714').style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><span class=cnblogs_code_Collapse id=Code_Closed_Text_215714 style="DISPLAY: none">Code</span><span id=Code_Open_Text_215714 style="DISPLAY: inline"><br><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="COLOR: #000000">&nbsp;&nbsp;BitStringModifier&nbsp;bitStringModifier;<br>&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;注册自定义的Modifier</span><span style="COLOR: #808080"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;google::template_modifiers::AddModifier(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">x-bitstring=</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">bitStringModifier);<br><br></span></span></div>
</font></span>
<img src ="http://www.cppblog.com/zealsoft/aggbug/64066.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zealsoft/" target="_blank">zealsoft</a> 2008-10-15 22:03 <a href="http://www.cppblog.com/zealsoft/archive/2008/10/15/64066.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于C++的模板引擎</title><link>http://www.cppblog.com/zealsoft/archive/2008/09/17/62013.html</link><dc:creator>zealsoft</dc:creator><author>zealsoft</author><pubDate>Wed, 17 Sep 2008 13:42:00 GMT</pubDate><guid>http://www.cppblog.com/zealsoft/archive/2008/09/17/62013.html</guid><wfw:comment>http://www.cppblog.com/zealsoft/comments/62013.html</wfw:comment><comments>http://www.cppblog.com/zealsoft/archive/2008/09/17/62013.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/zealsoft/comments/commentRss/62013.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zealsoft/services/trackbacks/62013.html</trackback:ping><description><![CDATA[模板引擎(Template engine)是实现模型和视图分离的一个重要手段。如果你从未接触过模板引擎可以看看<a href="http://en.wikipedia.org/wiki/Template_engine_(web)"><span>Wiki的介绍</span></a><span>。模板引擎的流行最初是因为网站开发的需要，象比较重要的几个模板引擎：</span><a href="http://smarty.php.net/"><span>SMARTY</span></a><span>、</span><a href="http://velocity.apache.org/"><span>Velocity</span></a><span>、</span><a href="http://www.stringtemplate.org/"><span>StringTemplate</span></a><span>都是来源于网页设计的。当然，除了网页设计，模板引擎还可以应用于其他领域，而我主要将其应用与代码生成器的设计中。<br><br>有关模板引擎，我推荐StringTemplate的作者</span><a href="http://www.stringtemplate.org/misc/contact"><span>Terence Parr</span></a> 写的一篇<a href="http://www.cs.usfca.edu/~parrt/papers/mvc.templates.pdf">英文论文</a>。Terence Parr是一个大学教授，写的文章自然学术性比较强，较难懂，但是很有参考价值。借助这篇文章的分析，我们可以发现当前模板引擎有着两种不同的思路：一种是严格将模型和视图分开的，设计模板系统时往往提供的模板语言比较简单，避免在模板语言中加入运算符号等，另一种是提供强大的模板语言功能，模板语言具有类似高级语言的功能，如各种条件判断语句，甚至数学运算能力。显然从模板编写者的角度看，后者具有更强大的功能，几乎无所不能，但是安全性不如前者，模板的编写者更容易利用系统漏洞做模板系统设计者没有想到的事情。这个问题仁者见仁，智者见智，好在由很多的模板系统可以选择。<br><br>绝大多数模板引擎都是支持Java、PHP、Python的，这当然和模板引擎的应用领域相关。我的代码生成器是用C++写的，而且必须支持Windows平台，所以选择的范围就比较有限了，从网络上搜索了一下，似乎只有<a href="http://teng.sourceforge.net/">Teng</a>、<a href="http://ctpp.havoc.ru/en/">CT++</a>和<a href="http://code.google.com/p/google-ctemplate/">Google CTemplate</a>可以使用了。我对3个系统进行了简单的评估，并实际使用过CT++和CTemplate，现在总结一下自己的心得，希望对大家有一些帮助。 <br><br>1、操作系统的支持<br>我的主要工作是在Windows上的，而模板引擎绝大多数是面向Unix/Linux的，这和我的需求有一定距离。当初曾经下载过Teng，但是折腾了半天也没有能够让其在Visual Studio 2003下成功编译，所以就放弃了，后来将CT++ 1.8简单地处理了一下就可以跑了，很开心。而Google CTemplate更提供了完全的Windows支持，这对于我这样的用户当然是非常省心了。<br><br>2、软件开发的活跃度<br>这些软件都是开源的，软件开发的活跃度当然是我关心的，有的工具刚开始用的时候很开心，但是后来开发者没有兴趣不玩了，而又没有人接手，BUG也无法更新了，就比较苦了，典型的象TurboPower。Teng似乎已经很长时间不更新了，CT++一直在更新，但是开发者是俄罗斯人，全部文档是俄文的，包括程序注释，以前1.8还有英文文档，从2.0以后就没有了，虽然最近承诺2.4以后会报告英文文档，但是我担心他哪天不高兴就不玩了，所以最后下定决心转到CTemplate去了。CTemplate虽然是Google的，而且据说Google内部也在使用，但是在模板引擎领域的名气却不大，好像作者的热情仍然很高，持续更新，而且可能很快要升级到1.0版本了，这给我很大的信心。<br><br>3、模板语言的功能<br>在我看来，模板语言的功能越强，提供的函数越多，它可能越受模板编写者的欢迎，但是可能不符合模型和视图严格分离的原则。Teng和CT++都属于模板语言功能强的一类，象Teng甚至提供了大量的运算符，而CTemplate显然是严格按照模型和视图分离原则设计的，它甚至没有提供if/else这样在其他模板系统中都有的功能。如前所述，这个问题仁者见仁，智者见智，不争论了。下面简单地列个表比较一下。由于CT++ 2没有英文文档，一直就没有使用过，可能会遗漏一些新功能。<br><br>
<table cellSpacing=0 cellPadding=3 border=1>
    <tbody>
        <tr>
            <td></td>
            <td align=middle>Teng</td>
            <td align=middle>CT++ </td>
            <td align=middle>CTemplate</td>
        </tr>
        <tr>
            <td>变量</td>
            <td>支持</td>
            <td>支持</td>
            <td>支持</td>
        </tr>
        <tr>
            <td>函数</td>
            <td>支持</td>
            <td>支持</td>
            <td>支持（Modifier）</td>
        </tr>
        <tr>
            <td>包含</td>
            <td>支持</td>
            <td>支持</td>
            <td>支持</td>
        </tr>
        <tr>
            <td>条件语句</td>
            <td>支持</td>
            <td>支持</td>
            <td>不支持</td>
        </tr>
        <tr>
            <td>循环</td>
            <td>支持</td>
            <td>支持</td>
            <td>支持</td>
        </tr>
        <tr>
            <td>计算</td>
            <td>支持</td>
            <td>不支持</td>
            <td>不支持</td>
        </tr>
        <tr>
            <td>赋值</td>
            <td>支持</td>
            <td>不支持</td>
            <td>不支持</td>
        </tr>
        <tr>
            <td>注释</td>
            <td>支持</td>
            <td>支持</td>
            <td>支持</td>
        </tr>
        <tr>
            <td>安全性设计</td>
            <td>不支持</td>
            <td>不支持</td>
            <td>支持</td>
        </tr>
        <tr>
            <td>用户定义函数</td>
            <td>不支持</td>
            <td>支持</td>
            <td>支持</td>
        </tr>
    </tbody>
</table>
<br>4、C++ API<br>基本的API几个软件都差不多，我觉得CTemplate更完善一些，特别喜欢它的调试功能。<br><br>总体来说，我对CT++还是有些难舍，但是综合考虑之后还是决定转到CTemplate上。 
<img src ="http://www.cppblog.com/zealsoft/aggbug/62013.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zealsoft/" target="_blank">zealsoft</a> 2008-09-17 21:42 <a href="http://www.cppblog.com/zealsoft/archive/2008/09/17/62013.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用UltraEdit实现从UNIX文件到DOS文件的批量转换 </title><link>http://www.cppblog.com/zealsoft/archive/2007/02/03/18309.html</link><dc:creator>zealsoft</dc:creator><author>zealsoft</author><pubDate>Sat, 03 Feb 2007 07:12:00 GMT</pubDate><guid>http://www.cppblog.com/zealsoft/archive/2007/02/03/18309.html</guid><wfw:comment>http://www.cppblog.com/zealsoft/comments/18309.html</wfw:comment><comments>http://www.cppblog.com/zealsoft/archive/2007/02/03/18309.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/zealsoft/comments/commentRss/18309.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zealsoft/services/trackbacks/18309.html</trackback:ping><description><![CDATA[
		<p>最近在使用<a href="http://www.reki.ru/products/ctpp/en/">CT++</a>这个软件时遇到这样一个问题：这个软件是在FREEBSD下开发的，虽然提供了C语言源程序，但程序在Visual Studio 2003下编译出现错误。检查原因，主要是因为源程序都是UNIX格式，每行的回车都是用一个0x0a字符表示的，而在WINDOWS/DOS下每行的回车都是用0x0d0a两个字符表示的，而该程序注释为俄文，影响了VS2003的处理，把大量的程序代码都当作注释了，所以编译就不能通过。要编译通过，必须先将UNIX文本格式转换为DOS格式的。UltraEdit的FILE菜单中提供了对单个文件进行这种转换的能力，但是一次只能转换一个文件，比较麻烦。经过一番研究，终于找到了一个批量实现转换的方法。在UE中选择Search | Search in files菜单，在Find框中填写^n（表示UNIX文件中的回车换行符号），在Replace with中输入^p（表示DOS文件中的回车换行符号），如下图所示。这样就可以实现批量替换了。</p>
		<img src="http://www.cnblogs.com/images/cnblogs_com/zealsoft/ultraedit.JPG" />
<img src ="http://www.cppblog.com/zealsoft/aggbug/18309.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zealsoft/" target="_blank">zealsoft</a> 2007-02-03 15:12 <a href="http://www.cppblog.com/zealsoft/archive/2007/02/03/18309.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何在Visual Studio.NET 2003下编译ANTLR 2.77</title><link>http://www.cppblog.com/zealsoft/archive/2007/01/01/17125.html</link><dc:creator>zealsoft</dc:creator><author>zealsoft</author><pubDate>Mon, 01 Jan 2007 14:54:00 GMT</pubDate><guid>http://www.cppblog.com/zealsoft/archive/2007/01/01/17125.html</guid><wfw:comment>http://www.cppblog.com/zealsoft/comments/17125.html</wfw:comment><comments>http://www.cppblog.com/zealsoft/archive/2007/01/01/17125.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zealsoft/comments/commentRss/17125.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zealsoft/services/trackbacks/17125.html</trackback:ping><description><![CDATA[
		<p>最近在研究如何开发一个编译器，初步决定使用<a class="" title="ANTLR" href="http://www.antlr.org" target="">ANTLR</a>。从ANTLR的网站上下载了最新的2.77版本的安装程序（MSI的）。安装之后，使用Visual Studio.NET 2003编译它的C++例子时发现编译照常而链接总是错误。仔细看了一下链接错误，发现是_memcpy_s、___CxxFrameHandler3等函数找不到。memcpy_s是Visual C++ 2005中新增加的函数，主要是为了提高代码的安全性。所有判断2.77安装版本中所提供的库是Visual C++ 2005编译的，无法用到Visual C++ 2003中。看来必须下载源代码版本，自己重新编译库了，不能偷懒了。</p>
		<p>从网站上又下载了源代码版本，解开后，发现所需要的C++文件都在lib/cpp目录中。该目录中有一个README文件，介绍了如何在Visual C++ 2003中进行编译，按照其介绍获得了成功。不过它的帮助文件中说需要使能Run Time Type Information，我没有修改相应的选项，目前看也没有什么关系。</p>
<img src ="http://www.cppblog.com/zealsoft/aggbug/17125.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zealsoft/" target="_blank">zealsoft</a> 2007-01-01 22:54 <a href="http://www.cppblog.com/zealsoft/archive/2007/01/01/17125.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>