﻿<?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++博客-winlinglin-随笔分类-C++</title><link>http://www.cppblog.com/winlinglin/category/9135.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 05 Mar 2009 09:31:37 GMT</lastBuildDate><pubDate>Thu, 05 Mar 2009 09:31:37 GMT</pubDate><ttl>60</ttl><item><title>#define 的用法</title><link>http://www.cppblog.com/winlinglin/archive/2009/03/04/75557.html</link><dc:creator>wil</dc:creator><author>wil</author><pubDate>Wed, 04 Mar 2009 15:08:00 GMT</pubDate><guid>http://www.cppblog.com/winlinglin/archive/2009/03/04/75557.html</guid><wfw:comment>http://www.cppblog.com/winlinglin/comments/75557.html</wfw:comment><comments>http://www.cppblog.com/winlinglin/archive/2009/03/04/75557.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/winlinglin/comments/commentRss/75557.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/winlinglin/services/trackbacks/75557.html</trackback:ping><description><![CDATA[宏的单行定义<br>#define&nbsp;A(x)&nbsp;T_##x<br>#define&nbsp;B（x)&nbsp;#@x<br><br>#define&nbsp;C（x)&nbsp;#x<br>我们假设：x=1，则有：<br>A(1)------〉T_1<br>B(1)------〉'1'<br>C(1)------〉"1"<br><br>##代表&#8220;连接&#8221;<br>#@代表&#8220;转为字符&#8221;<br>#代表 &#8220;转为字符串&#8221;<br><br><br>define的多行定义<br>define可以替代多行的代码，例如MFC中的宏定义（非常的经典）<br><br>#define&nbsp;MACRO(arg1,&nbsp;arg2)&nbsp;do&nbsp;{&nbsp;\<br>/*&nbsp;declarations&nbsp;*/&nbsp;\<br>stmt1;&nbsp;\<br>stmt2;&nbsp;\<br>/*&nbsp;...&nbsp;*/&nbsp;\<br>}&nbsp;while(0)&nbsp;/*&nbsp;(no&nbsp;trailing&nbsp;;&nbsp;)&nbsp;*/<br>关键是要在每一个换行的时候加上一个"\"&nbsp;<br>
<img src ="http://www.cppblog.com/winlinglin/aggbug/75557.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/winlinglin/" target="_blank">wil</a> 2009-03-04 23:08 <a href="http://www.cppblog.com/winlinglin/archive/2009/03/04/75557.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解析#pragma指令</title><link>http://www.cppblog.com/winlinglin/archive/2009/03/02/75340.html</link><dc:creator>wil</dc:creator><author>wil</author><pubDate>Mon, 02 Mar 2009 10:59:00 GMT</pubDate><guid>http://www.cppblog.com/winlinglin/archive/2009/03/02/75340.html</guid><wfw:comment>http://www.cppblog.com/winlinglin/comments/75340.html</wfw:comment><comments>http://www.cppblog.com/winlinglin/archive/2009/03/02/75340.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/winlinglin/comments/commentRss/75340.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/winlinglin/services/trackbacks/75340.html</trackback:ping><description><![CDATA[转自CSDN<br><br>在所有的预处理指令中，#Pragma 指令可能是最复杂的了，它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。<br>其格式一般为: #Pragma Para<br>其中Para 为参数，下面来看一些常用的参数。<br><br>(1)message 参数。 Message 参数是我最喜欢的一个参数，它能够在编译信息输出窗<br>口中输出相应的信息，这对于源代码信息的控制是非常重要的。其使用方法为：<br>#Pragma message(&#8220;消息文本&#8221;)<br>当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。<br>当我们在程序中定义了许多宏来控制源代码版本的时候，我们自己有可能都会忘记有没有正确的设置这些宏，此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法<br>#ifdef _X86<br>#Pragma message(&#8220;_X86 macro activated!&#8221;)<br>#endif<br>当我们定义了_X86这个宏以后，应用程序在编译时就会在编译输出窗口里显示&#8220;_<br>X86 macro activated!&#8221;。我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了<br>。<br><br>(2)另一个使用得比较多的pragma参数是code_seg。格式如：<br>#pragma code_seg( ["section-name"[,"section-class"] ] )<br>它能够设置程序中函数代码存放的代码段，当我们开发驱动程序的时候就会使用到它。<br><br>(3)#pragma once (比较常用）<br>只要在头文件的最开始加入这条指令就能够保证头文件被编译一次，这条指令实际上在VC6中就已经有了，但是考虑到兼容性并没有太多的使用它。<br><br>(4)#pragma hdrstop表示预编译头文件到此为止，后面的头文件不进行预编译。BCB可以预编译头文件以加快链接的速度，但如果所有头文件都进行预编译又可能占太多磁盘空间，所以使用这个选项排除一些头文件。 <br>有时单元之间有依赖关系，比如单元A依赖单元B，所以单元B要先于单元A编译。你可以用#pragma startup指定编译优先级，如果使用了#pragma package(smart_init) ，BCB就会根据优先级的大小先后编译。 <br><br>(5)#pragma resource "*.dfm"表示把*.dfm文件中的资源加入工程。*.dfm中包括窗体<br>外观的定义。 <br><br>(6)#pragma warning( disable : 4507 34; once : 4385; error : 164 )<br>等价于：<br>#pragma warning(disable:4507 34) // 不显示4507和34号警告信息<br>#pragma warning(once:4385) // 4385号警告信息仅报告一次<br>#pragma warning(error:164) // 把164号警告信息作为一个错误。<br>同时这个pragma warning 也支持如下格式：<br>#pragma warning( push [ ,n ] )<br>#pragma warning( pop )<br>这里n代表一个警告等级(1---4)。<br>#pragma warning( push )保存所有警告信息的现有的警告状态。<br>#pragma warning( push, n)保存所有警告信息的现有的警告状态，并且把全局警告<br>等级设定为n。 <br>#pragma warning( pop )向栈中弹出最后一个警告信息，在入栈和出栈之间所作的<br>一切改动取消。例如：<br>#pragma warning( push )<br>#pragma warning( disable : 4705 )<br>#pragma warning( disable : 4706 )<br>#pragma warning( disable : 4707 )<br>//.......<br>#pragma warning( pop ) <br>在这段代码的最后，重新保存所有的警告信息(包括4705，4706和4707)。<br>（7）pragma comment(...)<br>该指令将一个注释记录放入一个对象文件或可执行文件中。<br>常用的lib关键字，可以帮我们连入一个库文件。 
<img src ="http://www.cppblog.com/winlinglin/aggbug/75340.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/winlinglin/" target="_blank">wil</a> 2009-03-02 18:59 <a href="http://www.cppblog.com/winlinglin/archive/2009/03/02/75340.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>_cdecl,_stdcall,PASCAL,_fastcall,_thiscall </title><link>http://www.cppblog.com/winlinglin/archive/2008/12/15/69531.html</link><dc:creator>wil</dc:creator><author>wil</author><pubDate>Mon, 15 Dec 2008 14:08:00 GMT</pubDate><guid>http://www.cppblog.com/winlinglin/archive/2008/12/15/69531.html</guid><wfw:comment>http://www.cppblog.com/winlinglin/comments/69531.html</wfw:comment><comments>http://www.cppblog.com/winlinglin/archive/2008/12/15/69531.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/winlinglin/comments/commentRss/69531.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/winlinglin/services/trackbacks/69531.html</trackback:ping><description><![CDATA[_cdecl 是C Declaration的缩写，表示C语言默认的函数调用方法：所有参数从右到左依次入栈，这些参数由调用者清除，称为手动清栈。被调用函数无需要求调用者传递多少参数，调用者传递过多或者过少的参数，甚至完全不同的参数都不会产生编译阶段的错误。<br><br>_stdcall 是Standard Call的缩写，是C++的标准调用方式：所有参数从右到左依次入栈，如果是调用类成员的话，最后一个入栈的是this指针。这些堆栈中的参数由被调用的函数在返回后清除，使用的指令是 retn X，X表示参数占用的字节数，CPU在ret之后自动弹出X个字节的堆栈空间。称为自动清栈。函数在编译的时候就必须确定参数个数，并且调用者必须严格的控制参数的生成，不能多，不能少，否则返回后会出错。<br><br>PASCAL 是Pascal语言的函数调用方式，也可以在C/C++中使用，参数压栈顺序与前两者相反。返回时的清栈方式忘记了。。。<br><br>_fastcall 是编译器指定的快速调用方式。由于大多数的函数参数个数很少，使用堆栈传递比较费时。因此_fastcall通常规定将前两个（或若干个）参数由寄存器传递，其余参数还是通过堆栈传递。不同编译器编译的程序规定的寄存器不同。返回方式和_stdcall相当。<br><br>_thiscall 是为了解决类成员调用中this指针传递而规定的。_thiscall要求把this指针放在特定寄存器中，该寄存器由编译器决定。VC使用ecx，Borland的C++编译器使用eax。返回方式和_stdcall相当。<br><br>_fastcall 和 _thiscall涉及的寄存器由编译器决定，因此不能用作跨编译器的接口。所以Windows上的COM对象接口都定义为_stdcall调用方式。<br><br>C中不加说明默认函数为_cdecl方式（C中也只能用这种方式），C++也一样，但是默认的调用方式可以在IDE环境中设置。<br><br>带有可变参数的函数必须且只能使用_cdecl方式，例如下面的函数:<br>int printf(char * fmtStr, ...);<br>int scanf(char * fmtStr, ...);<br>
<img src ="http://www.cppblog.com/winlinglin/aggbug/69531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/winlinglin/" target="_blank">wil</a> 2008-12-15 22:08 <a href="http://www.cppblog.com/winlinglin/archive/2008/12/15/69531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>