??xml version="1.0" encoding="utf-8" standalone="yes"?>久久综合一区二区无码,久久精品夜夜夜夜夜久久,伊人精品久久久久7777http://www.shnenglu.com/gnupython/<font color=blue>......酒干倘卖无!......</font> <img src=http://services.nexodyne.com/email/icon/dcyohY1Q.RaZMinI0A%3D%3D/7.703%2BQ%3D/R01haWw%3D/0/image.png></img>zh-cnSun, 11 May 2025 22:59:42 GMTSun, 11 May 2025 22:59:42 GMT60C++中extern “C”含义深层探?/title><link>http://www.shnenglu.com/gnupython/archive/2006/04/10/5220.html</link><dc:creator>heart in the world</dc:creator><author>heart in the world</author><pubDate>Mon, 10 Apr 2006 01:37:00 GMT</pubDate><guid>http://www.shnenglu.com/gnupython/archive/2006/04/10/5220.html</guid><wfw:comment>http://www.shnenglu.com/gnupython/comments/5220.html</wfw:comment><comments>http://www.shnenglu.com/gnupython/archive/2006/04/10/5220.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/gnupython/comments/commentRss/5220.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/gnupython/services/trackbacks/5220.html</trackback:ping><description><![CDATA[ <p>声明Q本文ؓ转蝲Q文有作者联pL??br />先看一D代码:<br /></p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <span style="COLOR: #008080"> 1</span> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #000000">#ifndef __INCvxWorksh<br /></span> <span style="COLOR: #008080"> 2</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff">#define</span> <span style="COLOR: #000000"> __INCvxWorksh </span> <span style="COLOR: #000000"> <br /> </span> <span style="COLOR: #008080"> 3</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />#ifdef __cplusplus<br /></span> <span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000"> <img id="Codehighlighter1_75_113_Open_Image" onclick="this.style.display='none'; Codehighlighter1_75_113_Open_Text.style.display='none'; Codehighlighter1_75_113_Closed_Image.style.display='inline'; Codehighlighter1_75_113_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /> <img id="Codehighlighter1_75_113_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_75_113_Closed_Text.style.display='none'; Codehighlighter1_75_113_Open_Image.style.display='inline'; Codehighlighter1_75_113_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /> </span> <span style="COLOR: #0000ff">extern</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">C</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000"> </span> <span id="Codehighlighter1_75_113_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"> <img src="http://www.shnenglu.com/images/dot.gif" /> </span> <span id="Codehighlighter1_75_113_Open_Text"> <span style="COLOR: #000000">{<br /></span> <span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #0000ff">#endif</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000"> <br /> </span> <span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000"> <img id="Codehighlighter1_85_91_Open_Image" onclick="this.style.display='none'; Codehighlighter1_85_91_Open_Text.style.display='none'; Codehighlighter1_85_91_Closed_Image.style.display='inline'; Codehighlighter1_85_91_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /> <img id="Codehighlighter1_85_91_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_85_91_Closed_Text.style.display='none'; Codehighlighter1_85_91_Open_Image.style.display='inline'; Codehighlighter1_85_91_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> </span> <span id="Codehighlighter1_85_91_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span> <span id="Codehighlighter1_85_91_Open_Text"> <span style="COLOR: #008000">/*</span> <span style="COLOR: #008000"> <img src="http://www.shnenglu.com/images/dot.gif" /> </span> <span style="COLOR: #008000">*/</span> </span> <span style="COLOR: #000000"> <br /></span> <span style="COLOR: #008080"> 7</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />#ifdef __cplusplus<br /></span> <span style="COLOR: #008080"> 8</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> </span> <span style="COLOR: #008080"> 9</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff">#endif</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000"> <br /> </span> <span style="COLOR: #008080">10</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff">#endif</span> <span style="COLOR: #000000"> /* __INCvxWorksh */</span> </div> <u> <font style="BACKGROUND-COLOR: #ff0000">分析</font> <br /> </u>  昄Q头文g中的~译宏?ifndef __INCvxWorksh?define __INCvxWorksh?endif?的作用是防止该头文g被重复引用?br />   那么<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">#ifdef __cplusplus<br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img id="Codehighlighter1_30_59_Open_Image" onclick="this.style.display='none'; Codehighlighter1_30_59_Open_Text.style.display='none'; Codehighlighter1_30_59_Closed_Image.style.display='inline'; Codehighlighter1_30_59_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_30_59_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_30_59_Closed_Text.style.display='none'; Codehighlighter1_30_59_Open_Image.style.display='inline'; Codehighlighter1_30_59_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">extern</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_30_59_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/images/dot.gif" /></span><span id="Codehighlighter1_30_59_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />#ifdef __cplusplus<br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"> </span></div>的作用又是什么呢Q?br /><br />extern "C" 包含双重含义Q从字面上即可得刎ͼ首先Q被它修饰的目标是“extern”的Q其ơ,被它修饰的目标是“C”的。让我们来详l解读这两重含义?br /><br />  被extern "C"限定的函数或变量是externcd的;<br /><br />  extern是C/C++语言中表明函数和全局变量作用范围Q可见性)的关键字Q该关键字告诉编译器Q其声明的函数和变量可以在本模块或其它模块中使用。记住,下列语句Q?br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">extern</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> a;</span></div>仅仅是一个变量的声明Q其q不是在定义变量aQƈ未ؓa分配内存I间。变量a在所有模块中作ؓ一U全局变量只能被定义一ơ,否则会出现连接错误?br /><br />  通常Q在模块的头文g中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块BƲ引用该模块A中定义的全局变量和函数时只需包含模块A的头文g卛_。这P模块B中调用模块A中的函数Ӟ在编译阶D,模块B虽然找不到该函数Q但是ƈ不会报错Q它会在q接阶段中从模块A~译生成的目标代码中扑ֈ此函数?br /><br />  与extern对应的关键字是staticQ被它修饰的全局变量和函数只能在本模块中使用。因此,一个函数或变量只可能被本模块用时Q其不可能被extern “C”修饰?br /><br />  被extern "C"修饰的变量和函数是按照C语言方式~译和连接的Q?br /><br /><strong><font style="BACKGROUND-COLOR: #a52a2a">未加extern “C”声明时的编译方?/font></strong><br /><br />首先看看C++中对cMC的函数是怎样~译的?br /><br />  作ؓ一U面向对象的语言QC++支持函数重蝲Q而过E式语言C则不支持。函数被C++~译后在W号库中的名字与C语言的不同。例如,假设某个函数的原型ؓQ?br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> foo( </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> x, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> y );</span></div>该函数被C~译器编译后在符号库中的名字为_fooQ而C++~译器则会生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机Ӟ生成的新名字UCؓ“mangled name”)?br /><br />  _foo_int_intq样的名字包含了函数名、函数参数数量及cd信息QC++是靠这U机制来实现函数重蝲的。例如,在C++中,函数void foo( int x, int y )与void foo( int x, float y )~译生成的符h不相同的Q后者ؓ_foo_int_float?br /><br />        同样圎ͼC++中的变量除支持局部变量外Q还支持cL员变量和全局变量。用h~写E序的类成员变量可能与全局变量同名Q我们以"."来区分。而本质上Q编译器在进行编译时Q与函数的处理相|也ؓcM的变量取了一个独一无二的名字,q个名字与用L序中同名的全局变量名字不同?br />     <br />     <strong>未加extern "C"声明时的q接方式</strong><br />假设在C++中,模块A的头文g如下Q?br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 模块A头文件 moduleA.h</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #008000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">#ifndef MODULE_A_H<br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000"> MODULE_A_H</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> foo( </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> x, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> y );<br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">#endif</span></div>在模块B中引用该函数Q?br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 模块B实现文g moduleB.cpp</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #008000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">#include </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">moduleA.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />foo(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">);</span></div>实际上,在连接阶D,q接器会从模块A生成的目标文件moduleA.obj中寻找_foo_int_intq样的符P<br /><br />  <strong>加extern "C"声明后的~译和连接方?/strong><br /><br />  加extern "C"声明后,模块A的头文g变ؓQ?br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 模块A头文件 moduleA.h</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #008000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">#ifndef MODULE_A_H<br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000"> MODULE_A_H</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">extern</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> foo( </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> x, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> y );<br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">#endif</span></div>在模块B的实现文件中仍然调用foo( 2,3 )Q其l果是:<br /><br />  Q?Q模块A~译生成foo的目标代码时Q没有对其名字进行特D处理,采用了C语言的方式;<br /><br />  Q?Q连接器在ؓ模块B的目标代码寻找foo(2,3)调用ӞL的是未经修改的符号名_foo?br /><br />  如果在模块A中函数声明了foo为extern "C"cdQ而模块B中包含的是extern int foo( int x, int y ) Q则模块B找不到模块A中的函数Q反之亦然?br /><br />  所以,可以用一句话概括extern “C”这个声明的真实目的QQ何语a中的M语法Ҏ的诞生都不是随意而ؓ的,来源于真实世界的需求驱动。我们在思考问题时Q不能只停留在这个语a是怎么做的Q还要问一问它Z么要q么做,动机是什么,q样我们可以更深入地理解许多问题Q:<br />  实现C++与C及其它语a的؜合编E?br />  明白了C++中extern "C"的设立动机,我们下面来具体分析extern "C"通常的用技巧?br /><strong>extern "C"的惯用法<br /><br /></strong>  Q?Q在C++中引用C语言中的函数和变量,在包含C语言头文Ӟ假设为cExample.hQ时Q需q行下列处理Q?br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">extern</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_11_35_Open_Image" onclick="this.style.display='none'; Codehighlighter1_11_35_Open_Text.style.display='none'; Codehighlighter1_11_35_Closed_Image.style.display='inline'; Codehighlighter1_11_35_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_11_35_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_11_35_Closed_Text.style.display='none'; Codehighlighter1_11_35_Open_Image.style.display='inline'; Codehighlighter1_11_35_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_11_35_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/images/dot.gif" /></span><span id="Codehighlighter1_11_35_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />#include </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">cExample.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /><img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>而在C语言的头文g中,对其外部函数只能指定为externcdQC语言中不支持extern "C"声明Q在.c文g中包含了extern "C"时会出现~译语法错误?br /><br />  W者编写的C++引用C函数例子工程中包含的三个文g的源代码如下Q?br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img id="Codehighlighter1_0_22_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_22_Open_Text.style.display='none'; Codehighlighter1_0_22_Closed_Image.style.display='inline'; Codehighlighter1_0_22_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_0_22_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_22_Closed_Text.style.display='none'; Codehighlighter1_0_22_Open_Image.style.display='inline'; Codehighlighter1_0_22_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span id="Codehighlighter1_0_22_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_0_22_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> c语言头文ӞcExample.h </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />#ifndef C_EXAMPLE_H<br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000"> C_EXAMPLE_H</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">extern</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> add(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> x,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> y);<br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img id="Codehighlighter1_100_123_Open_Image" onclick="this.style.display='none'; Codehighlighter1_100_123_Open_Text.style.display='none'; Codehighlighter1_100_123_Closed_Image.style.display='inline'; Codehighlighter1_100_123_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_100_123_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_100_123_Closed_Text.style.display='none'; Codehighlighter1_100_123_Open_Image.style.display='inline'; Codehighlighter1_100_123_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_100_123_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_100_123_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> c语言实现文gQcExample.c </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">cExample.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> add( </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> x, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> y )<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img id="Codehighlighter1_171_187_Open_Image" onclick="this.style.display='none'; Codehighlighter1_171_187_Open_Text.style.display='none'; Codehighlighter1_171_187_Closed_Image.style.display='inline'; Codehighlighter1_171_187_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_171_187_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_171_187_Closed_Text.style.display='none'; Codehighlighter1_171_187_Open_Image.style.display='inline'; Codehighlighter1_171_187_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_171_187_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/images/dot.gif" /></span><span id="Codehighlighter1_171_187_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> x </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> y;<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> c++实现文gQ调用addQcppFile.cpp</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #008000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">extern</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> <br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img id="Codehighlighter1_230_254_Open_Image" onclick="this.style.display='none'; Codehighlighter1_230_254_Open_Text.style.display='none'; Codehighlighter1_230_254_Closed_Image.style.display='inline'; Codehighlighter1_230_254_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_230_254_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_230_254_Closed_Text.style.display='none'; Codehighlighter1_230_254_Open_Image.style.display='inline'; Codehighlighter1_230_254_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_230_254_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/images/dot.gif" /></span><span id="Codehighlighter1_230_254_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />#include </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">cExample.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> argc, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> argv[])<br /></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img id="Codehighlighter1_289_312_Open_Image" onclick="this.style.display='none'; Codehighlighter1_289_312_Open_Text.style.display='none'; Codehighlighter1_289_312_Closed_Image.style.display='inline'; Codehighlighter1_289_312_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_289_312_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_289_312_Closed_Text.style.display='none'; Codehighlighter1_289_312_Open_Image.style.display='inline'; Codehighlighter1_289_312_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_289_312_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/images/dot.gif" /></span><span id="Codehighlighter1_289_312_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />add(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">); <br /></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>如果C++调用一个C语言~写?DLLӞ当包?DLL的头文g或声明接口函数时Q应加extern "C" { }?br /><br />  Q?Q在C中引用C++语言中的函数和变量时QC++的头文g需dextern "C"Q但是在C语言中不能直接引用声明了extern "C"的该头文Ӟ应该仅将C文g中将C++中定义的extern "C"函数声明为externcd?br />  W者编写的C引用C++函数例子工程中包含的三个文g的源代码如下Q?br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000">C++头文件 cppExample.h</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #008000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">#ifndef CPP_EXAMPLE_H<br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000"> CPP_EXAMPLE_H</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">extern</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> add( </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> x, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> y );<br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">C++实现文g cppExample.cpp</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #008000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">#include </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">cppExample.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> add( </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> x, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> y )<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img id="Codehighlighter1_182_198_Open_Image" onclick="this.style.display='none'; Codehighlighter1_182_198_Open_Text.style.display='none'; Codehighlighter1_182_198_Closed_Image.style.display='inline'; Codehighlighter1_182_198_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_182_198_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_182_198_Closed_Text.style.display='none'; Codehighlighter1_182_198_Open_Image.style.display='inline'; Codehighlighter1_182_198_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_182_198_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/images/dot.gif" /></span><span id="Codehighlighter1_182_198_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> x </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> y;<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img id="Codehighlighter1_200_251_Open_Image" onclick="this.style.display='none'; Codehighlighter1_200_251_Open_Text.style.display='none'; Codehighlighter1_200_251_Closed_Image.style.display='inline'; Codehighlighter1_200_251_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_200_251_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_200_251_Closed_Text.style.display='none'; Codehighlighter1_200_251_Open_Image.style.display='inline'; Codehighlighter1_200_251_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_200_251_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_200_251_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"> C实现文g cFile.c<br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #008000"><img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />/* q样会编译出错:#include "cExample.h" </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">extern</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> add( </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> x, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> y );<br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main( </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> argc, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> argv[] )<br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img id="Codehighlighter1_320_346_Open_Image" onclick="this.style.display='none'; Codehighlighter1_320_346_Open_Text.style.display='none'; Codehighlighter1_320_346_Closed_Image.style.display='inline'; Codehighlighter1_320_346_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_320_346_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_320_346_Closed_Text.style.display='none'; Codehighlighter1_320_346_Open_Image.style.display='inline'; Codehighlighter1_320_346_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_320_346_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/images/dot.gif" /></span><span id="Codehighlighter1_320_346_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />add( </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">3</span><span style="COLOR: #000000"> ); <br /></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>如果深入理解了第3节中所阐述的extern "C"在编译和q接阶段发挥的作用,p真正理解本节所阐述的从C++引用C函数和C引用C++函数的惯用法。对W?节给出的CZ代码Q需要特别留意各个细节?br /><br />  Ƣ迎与作者联pL通。联pL式:<br />  Email: <a href="mailto:21cnbao@21cn.com"><font color="#002c99">21cnbao@21cn.com</font></a><br />  MSN: <a href="mailto:barrysong80@hotmail.com"><font color="#002c99">barrysong80@hotmail.com</font></a><br clear="all" /><img src ="http://www.shnenglu.com/gnupython/aggbug/5220.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/gnupython/" target="_blank">heart in the world</a> 2006-04-10 09:37 <a href="http://www.shnenglu.com/gnupython/archive/2006/04/10/5220.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>制作了一份eMule chm文,各位朋友要用的,请下Q?/title><link>http://www.shnenglu.com/gnupython/archive/2006/03/09/3939.html</link><dc:creator>heart in the world</dc:creator><author>heart in the world</author><pubDate>Thu, 09 Mar 2006 08:26:00 GMT</pubDate><guid>http://www.shnenglu.com/gnupython/archive/2006/03/09/3939.html</guid><wfw:comment>http://www.shnenglu.com/gnupython/comments/3939.html</wfw:comment><comments>http://www.shnenglu.com/gnupython/archive/2006/03/09/3939.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.shnenglu.com/gnupython/comments/commentRss/3939.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/gnupython/services/trackbacks/3939.html</trackback:ping><description><![CDATA[制作一份eMule文Q对学习eMule源代码大有帮助!提供交叉引用Q?BR>文g名:index.chm ׃博客每次只能上传最?MQ压~成四分P下蝲后把四部分放到同一个目录下Q用压winRar解压卛_?BR>下蝲地址Q?BR><A HREF="/Files/gnupython/index.part1.rar">index.part1.rar<BR></A><BR><A HREF="/Files/gnupython/index.part2.rar">index.part2.rar<BR></A><BR><A HREF="/Files/gnupython/index.part3.rar">index.part3.rar</A><BR><BR><A HREF="/Files/gnupython/index.part4.rar">index.part4.rar<BR></A><BR>有什么问题,h友留aQ谢Q?img src ="http://www.shnenglu.com/gnupython/aggbug/3939.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/gnupython/" target="_blank">heart in the world</a> 2006-03-09 16:26 <a href="http://www.shnenglu.com/gnupython/archive/2006/03/09/3939.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ACE的源码划分和library subsetting(转蝲)http://www.shnenglu.com/gnupython/archive/2006/02/26/3534.htmlheart in the worldheart in the worldSun, 26 Feb 2006 14:04:00 GMThttp://www.shnenglu.com/gnupython/archive/2006/02/26/3534.htmlhttp://www.shnenglu.com/gnupython/comments/3534.htmlhttp://www.shnenglu.com/gnupython/archive/2006/02/26/3534.html#Feedback0http://www.shnenglu.com/gnupython/comments/commentRss/3534.htmlhttp://www.shnenglu.com/gnupython/services/trackbacks/3534.html前几文章也提到q,ACE的所有源文g和头文g都杂乱堆在了ACE_wrappers/ace目录下。这L代码l织方式l学?A class=keyword >ACE带来了很大的困难Q很多朋友在看到ace目录下庞大的代码的时候,几乎失M学习ACE的信心^_^。因此,我们有必要对ACE的代码进行重新组l,以降低学习曲Uѝ下面,我将l出我对ACE源码的划分方法。其实,我也是刚学习ACE没有多久Q对ACE的了解还甚少Q所以,我的源码划方式法不一定十分正,q里׃n出来Q仅供大家参考?/P>

其实Q在ACE的帮助文里Q?A class=keyword >ACE-subsets.html?A class=keyword >ACE-categories.htmlQ这两个文档Ҏ?A class=keyword >ACE?A class=keyword >源码划分起到了很大的作用Q否则,我刚刚接?A class=keyword >ACEQ就惛_其进?A class=keyword >源码划分Q是不可能完成的?A class=keyword >ACE-subsets.htmlQ这个文主要介l了ACE?A class=keyword >library subsetting。正常情况下Q在~译?A class=keyword >ACE后,只会产生一?A class=keyword >ACE的库。我们可以根据该文的介l,单的修改一下MakefileQ就可以?A class=keyword >ACE的库q行子集化,我们可以~译出OS、Thread{这L子库?A class=keyword >ACE-categories.htmlQ这个文档对ACE中的代码q行了一些功能上的分cR具体大家可以详l的参考一下这两个文档Q这两个文对学?A class=keyword >ACEq是有一定的帮助的?/P>

?A class=keyword >ACE的源代码目录ace下,我将建立很多子目录,来对ACE的代码进行按功能分类Q?/P>


ACE_OSQ该目录里包含的代码是OS的API的wrapperQ也是ACE的OS适配层;
 包含代码Q?nbsp;ARGV.cpp         OS_Memory.cpp
  Argv_Type_Converter.cpp    OS_QoS.cpp
  Base_Thread_Adapter.cpp    OS_String.cpp
  Basic_Types.cpp            OS_TLI.cpp
  Copy_Disabled.cpp          OS_Thread_Adapter.cpp
  Env_Value_T.cpp            Sched_Params.cpp
  Handle_Set.cpp        Template_Instantiations.cpp
  Makefile                   Thread_Hook.cpp
  OS.cpp                     Time_Value.cpp
  OS_Dirent.cpp                
  OS_Errno.cpp                 
  OS_Log_Msg_Attributes.cpp

ACE_CodecQ该目录包含的是ACE的各U编码类型的处理代码Q目前只包含了BASE64~码的处理;
    包含代码QCodecs.cpp   Makefile


ACE_ConnectionQ该目录包含的是ACE中的Acceptor-Connector框架代码和异步通讯cM码;
  包含代码QAcceptor.cpp           Connector.cpp
   Asynch_Acceptor.cpp             Makefile
   Asynch_Connector.cpp        POSIX_Asynch_IO.cpp
   Asynch_IO.cpp                   Strategies_T.cpp
   Asynch_IO_Impl.cpp              Svc_Handler.cpp
   Asynch_Pseudo_Task.cpp      WIN32_Asynch_IO.cpp
   Cached_Connect_Strategy_T.cpp  
   Caching_Strategies_T.cpp       

ACE_DemuxQ该目录包含的是ACE中的Reactor和Proactor框架代码Q?BR>    包含代码QDev_Poll_Reactor.cpp     Priority_Reactor.cpp      TP_Reactor.cpp        Event_Handler.cpp         Proactor.cpp              TkReactor.cpp
  Event_Handler_T.cpp       QtReactor.cpp             WFMO_Reactor.cpp
  FlReactor.cpp            Reactor.cpp               WIN32_Proactor.cpp
  Makefile                  SUN_Proactor.cpp          XtReactor.cpp
  Msg_WFMO_Reactor.cpp      Select_Reactor.cpp       
  POSIX_CB_Proactor.cpp     Select_Reactor_Base.cpp  
  POSIX_Proactor.cpp        Select_Reactor_T.cpp

ACE_IPCQ该目录包含的是ACE中进E间通讯的一些封装代码:
  包含代码QATM_Acceptor.cpp             Makefile
  ATM_Addr.cpp                 Pipe.cpp
  ATM_Connector.cpp            SPIPE.cpp
  ATM_Params.cpp               SPIPE_Acceptor.cpp
  ATM_QoS.cpp                  SPIPE_Addr.cpp
  ATM_Stream.cpp               SPIPE_Connector.cpp
  DEV.cpp                      SPIPE_Stream.cpp
  DEV_Addr.cpp                 SV_Message.cpp
  DEV_Connector.cpp            SV_Message_Queue.cpp
  DEV_IO.cpp                   SV_Semaphore_Complex.cpp
  FIFO.cpp                     SV_Semaphore_Simple.cpp
  FIFO_Recv.cpp                SV_Shared_Memory.cpp
  FIFO_Recv_Msg.cpp            Signal.cpp
  FIFO_Send.cpp                TLI.cpp
  FIFO_Send_Msg.cpp            TLI_Acceptor.cpp
  FILE.cpp                     TLI_Connector.cpp
  FILE_Addr.cpp                TLI_Stream.cpp
  FILE_Connector.cpp           TTY_IO.cpp
  FILE_IO.cpp                  Typed_SV_Message.cpp
  IOStream.cpp                 Typed_SV_Message_Queue.cpp
  IOStream_T.cpp               UNIX_Addr.cpp
  IO_SAP.cpp                   UPIPE_Acceptor.cpp
  MEM_Acceptor.cpp             UPIPE_Connector.cpp
  MEM_Addr.cpp                 UPIPE_Stream.cpp
  MEM_Connector.cpp            XTI_ATM_Mcast.cpp
  MEM_IO.cpp                  
  MEM_SAP.cpp                 
  MEM_Stream.cpp

ACE_LIBQ该目录包?A class=keyword >ACE~译好的各个子库Q?/P>

ACE_LoggingQ该目录包含ACE中的日志处理相关代码Q?BR>       包含代码QDump.cpp                   Log_Msg_UNIX_Syslog.cpp
  Dump_T.cpp                 Log_Record.cpp
  Log_Msg.cpp                Logging_Strategy.cpp
  Log_Msg_Backend.cpp        Makefile
  Log_Msg_Callback.cpp       Trace.cpp
  Log_Msg_IPC.cpp           
  Log_Msg_NT_Event_Log.cpp  

ACE_MemoryQ该目录包含?A class=keyword >ACE内存处理相关代码Q?BR>     包含代码QBased_Pointer_Repository.cpp   Obstack.cpp
  Based_Pointer_T.cpp            Obstack_T.cpp
  Makefile                       PI_Malloc.cpp
  Malloc.cpp                     Read_Buffer.cpp
  Malloc_Allocator.cpp           Shared_Memory.cpp
  Malloc_Instantiations.cpp      Shared_Memory_MM.cpp
  Malloc_T.cpp                   Shared_Memory_SV.cpp
  Mem_Map.cpp                   
  Memory_Pool.cpp               
  Obchunk.cpp

ACE_MiscQ?A class=keyword >ACE中一些没有明功能分cȝ代码Q属于杂;
   包含代码QCE_Screen_Output.cpp   NT_Service.cpp
  Makefile               gethrtime.cpp

ACE_NameservicesQ该目录包含?A class=keyword >ACE中名字服务相关代码;
    包含代码Q?Name_Space.cpp
   Local_Name_Space.cpp           Naming_Context.cpp
   Local_Name_Space_T.cpp         Registry_Name_Space.cpp
   Makefile                       Remote_Name_Space.cpp
   Name_Proxy.cpp                
   Name_Request_Reply.cpp        

ACE_SocketsQ该目录包含的是ACE的socket装代码Q?BR>      包含代码QAddr.cpp                       SOCK_CODgram.cpp
  INET_Addr.cpp                  SOCK_Connector.cpp
  IPC_SAP.cpp                    SOCK_Dgram.cpp
  LOCK_SOCK_Acceptor.cpp         SOCK_Dgram_Bcast.cpp
  LSOCK.cpp                      SOCK_Dgram_Mcast.cpp
  LSOCK_Acceptor.cpp             SOCK_IO.cpp
  LSOCK_CODgram.cpp              SOCK_SEQPACK_Acceptor.cpp
  LSOCK_Connector.cpp            SOCK_SEQPACK_Association.cpp
  LSOCK_Dgram.cpp                SOCK_SEQPACK_Connector.cpp
  LSOCK_Stream.cpp               SOCK_Stream.cpp
  Makefile                       Sock_Connect.cpp
  Multihomed_INET_Addr.cpp      
  SOCK.cpp                      
  SOCK_Acceptor.cpp

ACE_StreamsQ该目录包含?A class=keyword >ACE中的Streams和Task框架代码Q?BR>      包含代码QCDR_Base.cpp                        Module.cpp
  CDR_Stream.cpp                      Multiplexor.cpp
  Codeset_IBM1047.cpp                 Reactor_Notification_Strategy.cpp
  Codeset_Registry.cpp                Stream.cpp
  Codeset_Registry_db.cpp             Stream_Modules.cpp
  IO_Cntl_Msg.cpp                     Task.cpp
  Makefile                            Task_T.cpp
  Message_Queue.cpp                  
  Message_Queue_T.cpp   

ACE_SvcconfQ该目录包含?A class=keyword >ACE中的Service Configurator框架代码Q?BR>      包含代码QDLL.cpp                    Service_Types.cpp
  DLL_Manager.cpp            Shared_Object.cpp
  Dynamic_Service.cpp        Svc_Conf.l
  Dynamic_Service_Base.cpp   Svc_Conf.y
  Makefile                   Svc_Conf_Lexer_Guard.cpp
  Parse_Node.cpp             Svc_Conf_l.cpp
  Service_Config.cpp         Svc_Conf_y.cpp
  Service_Manager.cpp        XML_Svc_Conf.cpp
  Service_Object.cpp        
  Service_Repository.cpp    
  Service_Templates.cpp

ACE_ThreadsQ该目录包含?A class=keyword >ACE中的U程和同步机制相关代码,例如Qthread manager;
      包含代码QActivation_Queue.cpp      Process_Manager.cpp       Thread.cpp
  Atomic_Op.cpp             Process_Mutex.cpp         Thread_Adapter.cpp
  Atomic_Op_T.cpp           Process_Semaphore.cpp     Thread_Control.cpp
  File_Lock.cpp             RW_Process_Mutex.cpp      Thread_Exit.cpp
  Future.cpp                Synch.cpp                 Thread_Manager.cpp
  Future_Set.cpp            Synch_Options.cpp         Token.cpp
  Makefile                  Synch_T.cpp              
  Process.cpp               Test_and_Set.cpp         

ACE_TimerQ该目录包含ACE中和旉相关的代码;
     包含代码QTimer_Heap.cpp
  Basic_Stats.cpp            Timer_Heap_T.cpp
  High_Res_Timer.cpp         Timer_List.cpp
  Makefile                   Timer_List_T.cpp
  Profile_Timer.cpp          Timer_Queue.cpp
  System_Time.cpp            Timer_Queue_Adapters.cpp
  Time_Request_Reply.cpp     Timer_Queue_T.cpp
  Timeprobe.cpp              Timer_Wheel.cpp
  Timeprobe_T.cpp            Timer_Wheel_T.cpp
  Timer_Hash.cpp            
  Timer_Hash_T.cpp          

ACE_TokenQToken?A class=keyword >ACE中实现的一U同步机Ӟ保证严格的FIFO或LIFO{略来获得锁?A class=keyword >ACE通过Token机制实现了分布式同步机制?BR>     包含代码QLocal_Tokens.cpp          Token_Collection.cpp      Token_Request_Reply.cpp
  Makefile                  Token_Invariants.cpp     
  Remote_Tokens.cpp         Token_Manager.cpp        

ACE_UtilsQ?A class=keyword >ACE中的一些基数据l构和算法的工具cM码;
    包含代码Q?A class=keyword >ACE.cpp                             Init_ACE.cpp
  Active_Map_Manager.cpp              Intrusive_List.cpp
  Active_Map_Manager_T.cpp            Intrusive_List_Node.cpp
  Arg_Shifter.cpp                     Lib_Find.cpp
  Array_Base.cpp                      Makefile
  Auto_IncDec_T.cpp                   Managed_Object.cpp
  Auto_Ptr.cpp                        Map.cpp
  Cache_Map_Manager_T.cpp             Map_Manager.cpp
  Caching_Utility_T.cpp               Map_T.cpp
  Capabilities.cpp                    Message_Block.cpp
  Cleanup_Strategies_T.cpp            Message_Block_T.cpp
  Configuration.cpp                   Method_Request.cpp
  Configuration_Import_Export.cpp     Node.cpp
  Connection_Recycling_Strategy.cpp   Notification_Strategy.cpp
  Containers.cpp                      Object_Manager.cpp
  Containers_T.cpp                    Pair.cpp
  Date_Time.cpp                       Pair_T.cpp
  Dirent.cpp                          RB_Tree.cpp
  Dirent_Selector.cpp                 Recyclable.cpp
  Dynamic.cpp                         Refcountable.cpp
  Filecache.cpp                       Registry.cpp
  Flag_Manip.cpp                      SString.cpp
  Framework_Component.cpp             Sample_History.cpp
  Framework_Component_T.cpp           Singleton.cpp
  Free_List.cpp                       Stats.cpp
  Functor.cpp                         String_Base.cpp
  Functor_T.cpp                       String_Base_Const.cpp
  Get_Opt.cpp                         Swap.cpp
  Handle_Ops.cpp                      Unbounded_Queue.cpp
  Hash_Cache_Map_Manager_T.cpp        Unbounded_Set.cpp
  Hash_Map_Manager.cpp                Unbounded_Set_Ex.cpp
  Hash_Map_Manager_T.cpp              Vector_T.cpp
  Hash_Map_With_Allocator_T.cpp      
  Hashable.cpp                       

includeQ该目录又包含子目录aceQ也是说include/ace/目录下,包含?A class=keyword >ACE的所有头文g?i文gQ之所以这Ll,是因?A class=keyword ace/OS.h"Q所以采用这U目录结构方式来存放头文件和.i文g。这里,对头文g?i  文gQ没有进一步按照功能划分,是因ؓ#include "ace/OS.h"q种包含方式Q如果头文g?i文g也按照功能划分,那么代码修改 量相当大Q?BR>            

通过上面l出的目录结构和源文件功能划分及头文件组l方式,怿读者以可以自行?A class=keyword >ACE代码q行整理了。在实际整理和编译代码的q程中,需要修改Makefile?A class=keyword >ACE头文件中以_T方式为后~的头文gQ例如:Obstack_T.hQ需要修攚w面模板源文g包含路径。我在下一文章中q行描述?/P>

我再ơ强调,上面ACE源码划分方式Q不一定十分正^_^Q随着我们ACE学习和理解的深入Q我们可能会q行更改。其实,在我们整?A class=keyword >ACE源文件的时候,我们可以q一步了?A class=keyword >ACE的各个源文g大致功能Q对我们以后更深入的学习大有裨益?/P>

heart in the world 2006-02-26 22:04 发表评论
]]>
BLOG开张致辞!http://www.shnenglu.com/gnupython/archive/2005/12/27/2198.htmlheart in the worldheart in the worldTue, 27 Dec 2005 15:06:00 GMThttp://www.shnenglu.com/gnupython/archive/2005/12/27/2198.htmlhttp://www.shnenglu.com/gnupython/comments/2198.htmlhttp://www.shnenglu.com/gnupython/archive/2005/12/27/2198.html#Feedback0http://www.shnenglu.com/gnupython/comments/commentRss/2198.htmlhttp://www.shnenglu.com/gnupython/services/trackbacks/2198.html

heart in the world 2005-12-27 23:06 发表评论
]]>
99þþþƷѹۿ| þþþavӰ | ަvþþ| þþþþþþƷɫ| þ91Ʒ91| þüۺɫۺϰҲȥ| ҹѸþӰԺ| þþƷ99þþ㽶| ޹СƵƷþþ | þþþѾƷ| þþþúǿ׊| þþƷа| 91þþƷһ| þҹɫ˾Ʒ| þùѾƷ| þþ޾Ʒ| þþƷˬ97| Ʒ99þþƷ| þþŮһ| Ʒþùһ㽶 | ձWVһһþ㽶| þþþAvר| 鶹þ| Ʒþþþһ | þþþþùƷ| þۺϾƷһ| þþƷӰѿ| Ĺ˾Ʒþò| ۿƷþ| һƷþþ޹| þþþþùƷ| þþþһ | 99þ99þþƷѿ| þۺϾþڹ| þþþavëƬ| Ʒ˾þþþҹӰ| þþþþùƷ| þۺ97ɫ| þùɫAVѿ| Ʒһþþ | þҹ1000ϼ|