??xml version="1.0" encoding="utf-8" standalone="yes"?>久久国产视屏,日韩久久久久中文字幕人妻,丁香狠狠色婷婷久久综合http://m.shnenglu.com/fenglinuestc/category/6969.htmlThings will not always be bad,enjoy it.zh-cnThu, 20 May 2010 09:00:20 GMTThu, 20 May 2010 09:00:20 GMT60- 调用U定(?http://m.shnenglu.com/fenglinuestc/articles/56326.htmlLexiliLexiliWed, 16 Jul 2008 09:58:00 GMThttp://m.shnenglu.com/fenglinuestc/articles/56326.htmlhttp://m.shnenglu.com/fenglinuestc/comments/56326.htmlhttp://m.shnenglu.com/fenglinuestc/articles/56326.html#Feedback0http://m.shnenglu.com/fenglinuestc/comments/commentRss/56326.htmlhttp://m.shnenglu.com/fenglinuestc/services/trackbacks/56326.html前段旉写个DLLl这个东西弄郁闷了?br>转自MSDN..http://www.microsoft.com/china/community/program/originalarticles/...(q个我也很无?
1、__stdcall调用U定相当?6位动态库中经怋用的PASCAL调用U定。在32位的VC++5.0?br>PASCAL调用U定不再被支持(实际上它已被定义为__stdcall。除了__pascal外,__fortran?br>__syscall也不被支持)Q取而代之的是__stdcall调用U定。两者实质上是一致的Q即函数的参数自
叛_左通过栈传递,被调用的函数在返回前清理传送参数的内存栈,但不同的是函数名的修饰部?br>Q关于函数名的修饰部分在后面详l说明)?br>_stdcall是PascalE序的缺省调用方式,通常用于Win32 Api中,函数采用从右到左的压栈方式,?br>己在退出时清空堆栈。VC函数编译后会在函数名前面加上下划线前缀Q在函数名后加上"@"和参?br>的字节数?br>2、C调用U定Q即用__cdecl关键字说明)按从双左的序压参数入栈,p用者把参数弹出栈?br>对于传送参数的内存栈是p用者来l护的(正因为如此,实现可变参数的函数只能用该调用U?br>定)。另外,在函数名修饰U定斚w也有所不同?br>_cdecl是C和CQ+E序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以生的
可执行文件大会比调用_stdcall函数的大。函数采用从叛_左的压栈方式。VC函数编译后会在?br>数名前面加上下划U前~。是MFC~省调用U定?br>3、__fastcall调用U定??如其名,它的主要特点是快,因ؓ它是通过寄存器来传送参数的Q实
际上Q它用ECX和EDX传送前两个双字QDWORDQ或更小的参敎ͼ剩下的参C旧自叛_左压栈传
送,被调用的函数在返回前清理传送参数的内存栈)Q在函数名修饰约定方面,它和前两者均不同?br>_fastcall方式的函数采用寄存器传递参敎ͼVC函数编译后会在函数名前面加?@"前缀Q在函数
名后加上"@"和参数的字节数?br>4、thiscall仅仅应用?C++"成员函数。this指针存放于CX寄存器,参数从右到左压。thiscall不是
关键词,因此不能被程序员指定?br>5、naked call采用1-4的调用约定时Q如果必要的话,q入函数时编译器会生代码来保存ESIQ?br>EDIQEBXQEBP寄存器,退出函数时则生代码恢复这些寄存器的内宏V?br>naked call不生这L代码。naked call不是cd修饰W,故必d_declspec共同使用?br>关键?__stdcall、__cdecl和__fastcall可以直接加在要输出的函数前,也可以在~译环境?br>Setting...\C/C++ \Code Generationw择。当加在输出函数前的关键字与~译环境中的选择?br>同时Q直接加在输出函数前的关键字有效。它们对应的命o行参数分别ؓ/Gz?Gd?Gr。缺省状?br>?GdQ即__cdecl?br>要完全模仿PASCAL调用U定首先必须使用__stdcall调用U定Q至于函数名修饰U定Q可以通过其它
Ҏ模仿。还有一个值得一提的是WINAPI宏,Windows.h支持该宏Q它可以出函数译成适当?br>调用U定Q在WIN32中,它被定义为__stdcall。用WINAPI宏可以创qAPIs?br>2)名字修饰U定
1、修饰名(Decoration name)
"C"或?C++"函数在内部(~译和链接)通过修饰名识别。修饰名是编译器在编译函数定义或者原
型时生成的字W串。有些情况下使用函数的修饰名是必要的Q如在模块定义文仉头指定输?C++"
重蝲函数、构造函数、析构函敎ͼ又如在汇~代码里?br>?C""?C++"函数{?br>修饰名由函数名、类名、调用约定、返回类型、参数等共同军_?br>2、名字修饰约定随调用U定和编译种c?C或C++)的不同而变化。函数名修饰U定随编译种cd?br>用约定的不同而不同,下面分别说明?br>a、C~译时函数名修饰U定规则Q?br>__stdcall调用U定在输出函数名前加上一个下划线前缀Q后面加上一?@"W号和其参数的字节数Q?br>格式?a href="mailto:_functionname@number">_functionname@number?br>__cdecl调用U定仅在输出函数名前加上一个下划线前缀Q格式ؓ_functionname?br>__fastcall调用U定在输出函数名前加上一?@"W号Q后面也是一?@"W号和其参数的字节数Q?br>格式为@functionname@number?br>它们均不改变输出函数名中的字W大写Q这和PASCAL调用U定不同QPASCALU定输出的函数名
无Q何修C全部大写?br>b、C++~译时函数名修饰U定规则Q?br>__stdcall调用U定Q?br>1、以"?"标识函数名的开始,后跟函数名;
2、函数名后面?@@YG"标识参数表的开始,后跟参数表;
3、参数表以代可C:
X--void Q?br>D--charQ?br>E--unsigned charQ?br>F--shortQ?br>H--intQ?br>I--unsigned intQ?br>J--longQ?br>K--unsigned longQ?br>M--floatQ?br>N--doubleQ?br>_N--boolQ?br>....
PA--表示指针Q后面的代号表明指针cdQ如果相同类型的指针q箋出现Q以"0"代替Q一?0"代表
一ơ重复;
4、参数表的第一ؓ该函数的q回值类型,其后依次为参数的数据cd,指针标识在其所指数据类?br>前;
5、参数表后以"@Z"标识整个名字的结束,如果该函数无参数Q则?Z"标识l束?br>其格式ؓ"?functionname@@YG*****@Z"??functionname@@YG*XZ"Q例?br>int Test1Qchar *var1,unsigned longQ?a href="mailto:-----“?Test1@@YGHPADK@Z">-----“?Test1@@YGHPADK@Z”
void Test2Q) -----“?Test2@@YGXXZ”
__cdecl调用U定Q?br>规则同上面的_stdcall调用U定Q只是参数表的开始标识由上面?@@YG"变ؓ"@@YA"?br>__fastcall调用U定Q?br>规则同上面的_stdcall调用U定Q只是参数表的开始标识由上面?@@YG"变ؓ"@@YI"?br>VC++对函数的省缺声明?__cedcl",只能被C/C++调用.

]]>- ~译、连接出错解决笔?/title>http://m.shnenglu.com/fenglinuestc/articles/49001.htmlLexiliLexiliTue, 06 May 2008 06:24:00 GMThttp://m.shnenglu.com/fenglinuestc/articles/49001.htmlhttp://m.shnenglu.com/fenglinuestc/comments/49001.htmlhttp://m.shnenglu.com/fenglinuestc/articles/49001.html#Feedback0http://m.shnenglu.com/fenglinuestc/comments/commentRss/49001.htmlhttp://m.shnenglu.com/fenglinuestc/services/trackbacks/49001.html1.LNK2001:
(vs2005)
a.无法解析外部W号 __security_cookie 'XXXX'?br>解决ҎQ选择“目”->“属?#8221;->“C/C++”->“代码生成”->“~冲区安全检?#8221;Q设?#8220;?#8221;Q当然这不是最好的ҎQ最实在的解x案应该是重新分析代码-_-Q?br>(vc6.0)
a.msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/XXXXX.exe : fatal error LNK1120: 1 unresolved externals
使用Unicode库的时候没有更改入口点,在Link->Output中把入口Ҏ为Unicode版本:wWinMainCRTStartup
2.LNK2019:
a.很可能是没有包含相应?h文gQ如果是多个目间的q接很可能是没有讄目的依赖项Q这个在VS2005里边l常出现Q?br>b.在写dll的时候经常出玎ͼ查调用约定等可以解决?br>d?...
3.LNK2015:
出现情况Q?br>a.函数或变量在两个不同的库中定?而且是弱定义Q这个基本上无解的?
b.函数没有实现的实体,q个最单了Q有代码的加代码Q无代码加库Q一切OK?

]]> - (?VC++~译器选项http://m.shnenglu.com/fenglinuestc/articles/48311.htmlLexiliLexiliMon, 28 Apr 2008 02:41:00 GMThttp://m.shnenglu.com/fenglinuestc/articles/48311.htmlhttp://m.shnenglu.com/fenglinuestc/comments/48311.htmlhttp://m.shnenglu.com/fenglinuestc/articles/48311.html#Feedback0http://m.shnenglu.com/fenglinuestc/comments/commentRss/48311.htmlhttp://m.shnenglu.com/fenglinuestc/services/trackbacks/48311.html
选项 |
目的 |
@ |
指定响应文g |
/? |
列出~译器选项 |
/AI |
指定在解析传递到 #using 指o的文件引用时搜烦的目?/td>
|
/arch |
使用 SSE ?SSE2 指o生成代码 |
/C |
在预处理期间保留注释 |
/c |
~译但不链接 |
/clr |
启用 C++ 的托扩展ƈ产生在公paq行库上q行的输出文?/td>
|
/D |
定义常数和宏 |
/E |
预处理器输出复制到标准输出 |
/EH |
指定异常处理模型 |
/EP |
预处理器输出复制到标准输出 |
/F |
讄堆栈大小 |
/FA |
创徏列表文g |
/Fa |
讄列表文g?/td>
|
/Fd |
重命名程序数据库文g |
/Fe |
重命名可执行文g |
/FI |
预处理指定的包含文g |
/Fm |
创徏映射文g |
/Fo |
创徏对象文g |
/Fp |
指定预编译头文g?/td>
|
/FR /Fr |
生成览器文?/td>
|
/FU |
强制使用文g名,像它已被传递到 #using 指o一?/td>
|
/Fx |
插入的代码与源文g合ƈ |
/G3 |
优化代码以优?386 处理器。在 Visual C++ 5.0 中已l停用,~译器将忽略此选项 |
/G4 |
优化代码以优?486 处理器。在 Visual C++ 5.0 中已l停用,~译器将忽略此选项 |
/G5 |
优化代码以优?Pentium 处理?/td>
|
/G6 |
优化代码以优?Pentium Pro、Pentium II ?Pentium III 处理?/td>
|
/G7 |
针对 Pentium 4 ?Athlon 优化代码?/td>
|
/GA |
优化 Windows 应用E序的代?/td>
|
/GB |
?/G6 {效Q将 _M_IX86 的D|ؓ 600 |
/Gd |
使用 __cdecl 调用U定 |
/Ge |
Ȁzd栈探?/td>
|
/GF /Gf |
启用字符串池 |
/GH |
调用挂钩函数 _pexit |
/Gh |
调用挂钩函数 _penter |
/GL |
启用全程序优?/td>
|
/Gm |
启用最重新生?/td>
|
/GR |
启用q行时类型信?(RTTI) |
/Gr |
使用 __fastcall 调用U定 |
/GS |
~冲区安全检?/td>
|
/Gs |
控制堆栈探测 |
/GT |
支持使用静态线E本地存储区分配的数据的U程安全 |
/GX |
启用同步异常处理 |
/Gy |
启用函数U链?/td>
|
/GZ |
?/RTC1 相同 |
/Gz |
使用 __stdcall 调用U定 |
/H |
限制外部Q公共)名称的长?/td>
|
/HELP |
列出~译器选项 |
/I |
在目录中搜烦包含文g |
/J |
更改默认?char cd |
/LD |
创徏动态链接库 |
/LDd |
创徏调试动态链接库 |
/link |
指定的选项传递给 LINK |
/MD |
使用 MSVCRT.lib 创徏多线E?DLL |
/MDd |
使用 MSVCRTD.lib 创徏调试多线E?DLL |
/ML |
使用 LIBC.lib 创徏单线E可执行文g |
/MLd |
使用 LIBCD.lib 创徏调试单线E可执行文g |
/MT |
使用 LIBCMT.lib 创徏多线E可执行文g |
/MTd |
使用 LIBCMTD.lib 创徏调试多线E可执行文g |
/nologo |
取消昄d版权标志 |
/O1 |
创徏代?/td>
|
/O2 |
创徏快速代?/td>
|
/Oa |
假设没有别名 |
/Ob |
控制内联展开 |
/Od |
用优化 |
/Og |
使用全局优化 |
/Oi |
生成内部函数 |
/Op |
改善点C致?/td>
|
/Os |
代码大小优先 |
/Ot |
代码速度优先 |
/Ow |
假定在函数调用中使用别名 |
/Ox |
使用最大优?(/Ob2gity /Gs) |
/Oy |
省略框架指针 |
/QI0f |
执行 Pentium 0x0f 错误修复 |
/QIfdiv |
执行 Pentium FDIV 错误修复 |
/QIfist |
当需要从点cd转换为整型时取消 _ftol |
/P |
预处理器输出写入文?/td>
|
/RTC |
启用q行旉误检?/td>
|
/showIncludes |
在编译期间显C包含文件的列表 |
/Tc /TC |
指定 C 源文?/td>
|
/Tp /TP |
指定 C++ 源文?/td>
|
/U |
U除预定义宏 |
/u |
U除所有的预定义宏 |
/V |
讄版本字符?/td>
|
/vd |
取消或启用隐藏的 vtordisp cL?/td>
|
/vmb |
Ҏ向成员的指针使用最佳的?/td>
|
/vmg |
Ҏ向成员的指针使用完全一般?/td>
|
/vmm |
声明多重l承 |
/vms |
声明单一l承 |
/vmv |
声明虚拟l承 |
/W |
讄警告{ |
/w |
用所有警?/td>
|
/Wall |
启用所有警告,包括默认情况下禁用的警告 |
/WL |
在从命o行编?C++ 源代码时启用错误信息和警告消息的单行诊断 |
/Wp64 |
?64 位可UL性问?/td>
|
/X |
忽略标准包含目录 |
/Y- |
忽略当前生成中的所有其他预~译头编译器选项 |
/Yc |
创徏预编译头文g |
/Yd |
完整的调试信息攑֜所有对象文件中 |
/Yl |
创徏调试库时插入 PCH 引用 |
/Yu |
在生成期间用预~译头文?/td>
|
/YX |
自动处理预编译头 |
/Z7 |
生成?C 7.0 兼容的调试信?/td>
|
/Za |
用语言扩展 |
/Zc |
?/Ze 下指定标准行?/td>
|
/Zd |
生成行号 |
/Ze |
启用语言扩展 |
/Zg |
生成函数原型 |
|
调试信息包含在?#8220;~辑ql?#8221;兼容的程序数据库?/td>
|
/Zi |
生成完整的调试信?/td>
|
/Zl |
?.obj 文g中移除默认库?/td>
|
/Zm |
指定预编译头内存分配限制 |
/Zp |
装l构成员 |
/Zs |
只检查语?/td>
|
技术果然是靠迫出来?好久之前想都没有惌的编译器的东西现在要研究?_-....

]]> - (?C++中的预处?/title>http://m.shnenglu.com/fenglinuestc/articles/48172.htmlLexiliLexiliSat, 26 Apr 2008 01:09:00 GMThttp://m.shnenglu.com/fenglinuestc/articles/48172.htmlhttp://m.shnenglu.com/fenglinuestc/comments/48172.htmlhttp://m.shnenglu.com/fenglinuestc/articles/48172.html#Feedback0http://m.shnenglu.com/fenglinuestc/comments/commentRss/48172.htmlhttp://m.shnenglu.com/fenglinuestc/services/trackbacks/48172.html在C++的历史发展中Q有很多的语a特征Q特别是语言的晦涩之处)来自于C语言Q预
处理是其中的一个。C++从C语言那里把C语言预处理器l承q来QC语言预处理器Q被Bj
arne博士UCؓCppQ不知道是不是C Program Preprocessor的简Uͼ?br>二、常见的预处理功能:
预处理器的主要作用就是把通过预处理的内徏功能对一个资源进行等h换,最常见
的预处理有:文g包含Q条件编译、布局控制和宏替换4U?br>文g包含Q?include 是一U最为常见的预处理,主要是做为文件的引用l合源程序正
文?br>条g~译Q?if,#ifndef,#ifdef,#endif,#undef{也是比较常见的预处理,主要是进
行编译时q行有选择的挑选,注释掉一些指定的代码Q以辑ֈ版本控制、防止对文g重复
包含的功能?br>布局控制Q?progmaQ这也是我们应用预处理的一个重要方面,主要功能是ؓ~译E序
提供非常规的控制信息?br>宏替换: #defineQ这是最常见的用法,它可以定义符号常量、函数功能、重新命?br>、字W串的拼接等各种功能?br>三、预处理指oQ?br>预处理指令的格式如下Q?br># directive tokens
#W号应该是这一行的W一个非I字W,一般我们把它放在v始位|。如果指令一行放
不下Q可以通过\q行控制Q例如:
#define Error if(error) exit(1) {h?br>#define Error \
if(error) exit(1)
不过我们Z化赯Q一般都不怎么q么用,更常见的方式如下Q?br># ifdef __BORLANDC__
if_true<(is_convertible<Value,named_template_param_base>::value)>::
template then<make_named_arg, make_key_value>::type Make;
# else
enum { is_named = is_named_parameter<Value>::value };
typedef typename if_true<(is_named)>::template
then<make_named_arg, make_key_value>::type Make;
# endif
下面我们看一下常见的预处理指令:
#define 宏定?br>#undef 未定义宏
#include 文本包含
#ifdef 如果宏被定义p行编?br>#ifndef 如果宏未被定义就q行~译
#endif l束~译块的控制
#if 表达式非零就对代码进行编?br>#else 作ؓ其他预处理的剩余选项q行~译
#elif q是一U?else?if的组合选项
#line 改变当前的行数和文g名称
#error 输出一个错误信?br>#pragma 为编译程序提供非常规的控制流信息
下面我们对这些预处理q行一一的说明,考虑到宏的重要性和J琐性,我们把它攑ֈ
最后讲?br>四、文件包含指令:
q种预处理用方式是最为常见的Q^时我们编写程序都会用刎ͼ最常见的用法是Q?br>#include <iostream> //标准库头文g
#include <iostream.h> //旧式的标准库头文?br>#include "IO.h" //用户自定义的头文?br>#include "../file.h" //UNIX下的父目录下的头文g
#include "/usr/local/file.h" //UNIX下的完整路径
#include "..\file.h" //Dos下的父目录下的头文g
#include "\usr\local\file.h" //Dos下的完整路径
q里面有2个地方要注意Q?br>1、我们用<iostream>q是<iostream.h>?
我们d使用<iostream>Q而不?lt;iostream.h>,Z么呢Q我想你可能q记得我
曄l出q几点理由,q里我大致的说一下:
首先Q?h格式的头文g早在98q?月䆾p标准委员会抛弃了Q我们应该紧跟标?br>Q以适合时代的发展?br>其次Qiostream.h只支持窄字符集,iostream则支持窄/宽字W集?br>q有Q标准对iostream作了很多的改动,接口和实现都有了变化?br>最后,iostreamlg全部攑օnamespace std中,防止了名字污染?br>2?lt;io.h>?io.h"的区别?
其实他们唯一的区别就是搜索\径不同:
对于#include <io.h> Q编译器从标准库路径开始搜?br>对于#include "io.h" Q编译器从用L工作路径开始搜?br>五、编译控制指令:
q些指o的主要目的是q行~译时进行有选择的挑选,注释掉一些指定的代码Q以?br>到版本控制、防止对文g重复包含的功能?br>使用格式Q如下:
1?br>#ifdef identifier
your code
#endif
如果identifierZ个定义了的符Pyour code׃被编译,否则剔除
2?br>#ifndef identifier
your code
#endif
如果identifierZ个未定义的符Pyour code׃被编译,否则剔除
3?br>#if expression
your code
#endif
如果expression非零Qyour code׃被编译,否则剔除
4?br>#ifdef identifier
your code1
#else
your code2
#endif
如果identifierZ个定义了的符Pyour code1׃被编译,否则your
code2׃被编?br>5?br>#if expressin1
your code1
#elif expression2 //呵呵Qelif
your code2
#else
your code3
#enif
如果epression1非零Q就~译your code1Q否则,如果expression2非零Q就~译y
our code2Q否则,q译your code3
其他预编译指?br>除了上面我们说的集中常用的编译指令,q有3U不太常见的~译指oQ?line?err
or?pragmaQ我们接下来q单的谈一下?br>#line的语法如下:
#line number filename
例如Q?line 30 a.h 其中Q文件名a.h可以省略不写?br>q条指o可以改变当前的行号和文g名,例如上面的这条预处理指o可以改变当?br>的行号ؓ30Q文件名是a.h。初看v来似乎没有什么用Q不q,他还是有点用的,那就是用
在编译器的编写中Q我们知道编译器对C++源码~译q程中会产生一些中间文Ӟ通过q条
指oQ可以保证文件名是固定的Q不会被q些中间文g代替Q有利于q行分析?br>#error语法如下Q?br>#error info
例如Q?ifndef UNIX
#error This software requires the UNIX OS.
#endif
q条指o主要是给出错误信息,上面的这个例子就是,如果没有在UNIX环境下,׃
输出This software requires the UNIX OS.然后诱发~译器终止。所以ȝ来说Q这条指
令的目的是在程序崩溃之前能够给Z定的信息?br>#pragma是非l一的,他要依靠各个~译器生产者,例如Q在SUN C++~译器中Q?br>// 把name和val的v始地址调整?个字节的倍数
#progma align 8 (name, val)
char name[9];
double val;
//在程序执行开始,调用函数MyFunction
#progma init (MyFunction)
预定义标识符
Z处理一些有用的信息Q预处理定义了一些预处理标识W,虽然各种~译?br>的预?br>理标识符不尽相同Q但是他们都会处理下面的4U:
__FILE__ 正在~译的文件的名字
__LINE__ 正在~译的文件的行号
__DATE__ ~译时刻的日期字W串Q例如: "25 Dec 2000"
__TIME__ ~译时刻的时间字W串Q例如: "12:30:55"
例如Qcout<<"The file is :"<<__FILE__"<<"! The lines is:
"<<__LINE__<<endl;
预处理何M?br>如何取代#include预处理指令,我们在这里就不再一一讨论了?br>C++q没有ؓ#include提供替代形式Q但是namespace提供了一U作用域机制Q?br>它能?br>某种方式支持l合Q利用它可以改善#include的行为方式,但是我们q是无法取代
#include?br>#progma应该是一个可有可无的预处理指令,按照C++之父Bjarne的话_?br>是:"
#progma被过分的l常的用于将语言语义的变形隐藏到~译pȝ里,或者被用于?br>供带有特D语义和W拙语法的语a扩充?#8221;
对于#ifdefQ我们仍然束手无{,q是我们利用if语句和常量表辑ּQ仍?br>不?br>替代她,因ؓ一个if语句的正文必d语法上正,满cL查,即他处在一?br>l不会被执行的分支里面?

]]>
þþþۺĻ|
97Ʒ91þþþþ|
ŷպþĻ|
ŷһþþþþþô|
þþۺϾɫ۹|
MM131Ůþ|
þþþþþòҰ¸߳|
һɫþ88ձȡۺ|
99REþþƷﶼǾƷ|
þ㽶߿ۿƷyw|
þۺ|
ŷҹƷþþþ|
þۺϸϾþúݺݺ97ɫ69|
ƷëٸAVѾþ|
һɫþۺ|
ձvaĻþ|
ݺݾþ
|
þþþ|
þþþþùƷŮ|
þþþһ|
Ʒþ|
Ʒþþϼ2|
뾫Ʒþþþþ|
þ99Ʒþþþþþþþ
|
þseƷһƷ|
ƷŮþþ|
㽶þavһ|
һþ֪ۺϾþ|
þþƷһ|
þþƷAV㽶|
þþþþþþþþþþþ|
Ʒþò|
˾Ʒþ|
ƷþþþþþþþĻ
|
˼˼þ99ֻƵƷ66|
Ʒþþþþù
|
ƷþõӰŷ|
˾þ|
鶹һ99þþþ|
ŷҹƷþþþ
|
þùƷ|