﻿<?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++博客-&lt;font size=6 color=red&gt;Heart for communicating&lt;/font&gt;</title><link>http://www.cppblog.com/gnupython/</link><description>&lt;font  color=blue&gt;......酒干倘卖无！......&lt;/font&gt;
&lt;img src=http://services.nexodyne.com/email/icon/dcyohY1Q.RaZMinI0A%3D%3D/7.703%2BQ%3D/R01haWw%3D/0/image.png&gt;&lt;/img&gt;</description><language>zh-cn</language><lastBuildDate>Sat, 04 Apr 2026 05:37:09 GMT</lastBuildDate><pubDate>Sat, 04 Apr 2026 05:37:09 GMT</pubDate><ttl>60</ttl><item><title>C++中extern “C”含义深层探索</title><link>http://www.cppblog.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.cppblog.com/gnupython/archive/2006/04/10/5220.html</guid><wfw:comment>http://www.cppblog.com/gnupython/comments/5220.html</wfw:comment><comments>http://www.cppblog.com/gnupython/archive/2006/04/10/5220.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gnupython/comments/commentRss/5220.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gnupython/services/trackbacks/5220.html</trackback:ping><description><![CDATA[
		<p>声明：本文为转载！文尾有作者联系方式 。<br />先看一段代码：<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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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>　　显然，头文件中的编译宏“#ifndef __INCvxWorksh、#define __INCvxWorksh、#endif” 的作用是防止该头文件被重复引用。<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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"> </span></div>的作用又是什么呢？<br /><br />extern "C" 包含双重含义，从字面上即可得到：首先，被它修饰的目标是“extern”的；其次，被它修饰的目标是“C”的。让我们来详细解读这两重含义。<br /><br />　　被extern "C"限定的函数或变量是extern类型的；<br /><br />　　extern是C/C++语言中表明函数和全局变量作用范围（可见性）的关键字，该关键字告诉编译器，其声明的函数和变量可以在本模块或其它模块中使用。记住，下列语句：<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.cppblog.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>仅仅是一个变量的声明，其并不是在定义变量a，并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次，否则会出现连接错误。<br /><br />　　通常，在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如，如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样，模块B中调用模块A中的函数时，在编译阶段，模块B虽然找不到该函数，但是并不会报错；它会在连接阶段中从模块A编译生成的目标代码中找到此函数。<br /><br />　　与extern对应的关键字是static，被它修饰的全局变量和函数只能在本模块中使用。因此，一个函数或变量只可能被本模块使用时，其不可能被extern “C”修饰。<br /><br />　　被extern "C"修饰的变量和函数是按照C语言方式编译和连接的；<br /><br /><strong><font style="BACKGROUND-COLOR: #a52a2a">未加extern “C”声明时的编译方式</font></strong><br /><br />首先看看C++中对类似C的函数是怎样编译的。<br /><br />　　作为一种面向对象的语言，C++支持函数重载，而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如，假设某个函数的原型为：<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.cppblog.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编译器编译后在符号库中的名字为_foo，而C++编译器则会产生像_foo_int_int之类的名字（不同的编译器可能生成的名字不同，但是都采用了相同的机制，生成的新名字称为“mangled name”）。<br /><br />　　_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息，C++就是靠这种机制来实现函数重载的。例如，在C++中，函数void foo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的，后者为_foo_int_float。<br /><br />        同样地，C++中的变量除支持局部变量外，还支持类成员变量和全局变量。用户所编写程序的类成员变量可能与全局变量同名，我们以"."来区分。而本质上，编译器在进行编译时，与函数的处理相似，也为类中的变量取了一个独一无二的名字，这个名字与用户程序中同名的全局变量名字不同。<br />     <br />     <strong>未加extern "C"声明时的连接方式</strong><br />假设在C++中，模块A的头文件如下：<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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">#endif</span></div>在模块B中引用该函数：<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.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 模块B实现文件　moduleB.cpp</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #008000"><img src="http://www.cppblog.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.cppblog.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>实际上，在连接阶段，连接器会从模块A生成的目标文件moduleA.obj中寻找_foo_int_int这样的符号！<br /><br />　　<strong>加extern "C"声明后的编译和连接方式</strong><br /><br />　　加extern "C"声明后，模块A的头文件变为：<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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">#endif</span></div>在模块B的实现文件中仍然调用foo( 2,3 )，其结果是：<br /><br />　　（1）模块A编译生成foo的目标代码时，没有对其名字进行特殊处理，采用了C语言的方式；<br /><br />　　（2）连接器在为模块B的目标代码寻找foo(2,3)调用时，寻找的是未经修改的符号名_foo。<br /><br />　　如果在模块A中函数声明了foo为extern "C"类型，而模块B中包含的是extern int foo( int x, int y ) ，则模块B找不到模块A中的函数；反之亦然。<br /><br />　　所以，可以用一句话概括extern “C”这个声明的真实目的（任何语言中的任何语法特性的诞生都不是随意而为的，来源于真实世界的需求驱动。我们在思考问题时，不能只停留在这个语言是怎么做的，还要问一问它为什么要这么做，动机是什么，这样我们可以更深入地理解许多问题）：<br />　　实现C++与C及其它语言的混合编程。<br />　　明白了C++中extern "C"的设立动机，我们下面来具体分析extern "C"通常的使用技巧。<br /><strong>extern "C"的惯用法<br /><br /></strong>　　（1）在C++中引用C语言中的函数和变量，在包含C语言头文件（假设为cExample.h）时，需进行下列处理：<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.cppblog.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.cppblog.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.cppblog.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.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_11_35_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.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.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>而在C语言的头文件中，对其外部函数只能指定为extern类型，C语言中不支持extern "C"声明，在.c文件中包含了extern "C"时会出现编译语法错误。<br /><br />　　笔者编写的C++引用C函数例子工程中包含的三个文件的源代码如下：<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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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语言实现文件：cExample.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> c++实现文件，调用add：cppFile.cpp</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #008000"><img src="http://www.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>如果C++调用一个C语言编写的.DLL时，当包括.DLL的头文件或声明接口函数时，应加extern "C" {　}。<br /><br />　　（2）在C中引用C++语言中的函数和变量时，C++的头文件需添加extern "C"，但是在C语言中不能直接引用声明了extern "C"的该头文件，应该仅将C文件中将C++中定义的extern "C"函数声明为extern类型。<br />　　笔者编写的C引用C++函数例子工程中包含的三个文件的源代码如下：<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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">C++实现文件 cppExample.cpp</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #008000"><img src="http://www.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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实现文件 cFile.c<br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />/* 这样会编译出错：#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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.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.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>如果深入理解了第3节中所阐述的extern "C"在编译和连接阶段发挥的作用，就能真正理解本节所阐述的从C++引用C函数和C引用C++函数的惯用法。对第4节给出的示例代码，需要特别留意各个细节。<br /><br />　　欢迎与作者联系沟通。联系方式：<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.cppblog.com/gnupython/aggbug/5220.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gnupython/" target="_blank">heart in the world</a> 2006-04-10 09:37 <a href="http://www.cppblog.com/gnupython/archive/2006/04/10/5220.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>制作了一份eMule chm文档,各位朋友要用的，请下！</title><link>http://www.cppblog.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.cppblog.com/gnupython/archive/2006/03/09/3939.html</guid><wfw:comment>http://www.cppblog.com/gnupython/comments/3939.html</wfw:comment><comments>http://www.cppblog.com/gnupython/archive/2006/03/09/3939.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/gnupython/comments/commentRss/3939.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gnupython/services/trackbacks/3939.html</trackback:ping><description><![CDATA[制作一份eMule文档，对学习eMule源代码大有帮助！提供交叉引用，<BR>文件名：index.chm 由于博客每次只能上传最多2M，压缩成四分卷，下载后把四部分放到同一个目录下，用压winRar解压即可。<BR>下载地址：<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>有什么问题，请朋友留言！谢！<img src ="http://www.cppblog.com/gnupython/aggbug/3939.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gnupython/" target="_blank">heart in the world</a> 2006-03-09 16:26 <a href="http://www.cppblog.com/gnupython/archive/2006/03/09/3939.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ACE的源码划分和library subsetting(转载)</title><link>http://www.cppblog.com/gnupython/archive/2006/02/26/3534.html</link><dc:creator>heart in the world</dc:creator><author>heart in the world</author><pubDate>Sun, 26 Feb 2006 14:04:00 GMT</pubDate><guid>http://www.cppblog.com/gnupython/archive/2006/02/26/3534.html</guid><wfw:comment>http://www.cppblog.com/gnupython/comments/3534.html</wfw:comment><comments>http://www.cppblog.com/gnupython/archive/2006/02/26/3534.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gnupython/comments/commentRss/3534.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gnupython/services/trackbacks/3534.html</trackback:ping><description><![CDATA[<P>前几篇文章也提到过，<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>的所有源文件和头文件都杂乱堆在了<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>_wrappers/ace目录下。这样的代码组织方式给学习<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>带来了很大的困难，很多朋友在看到ace目录下庞大的代码的时候，几乎就失去了学习<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>的信心^_^。因此，我们有必要对<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>的代码进行重新组织，以降低学习曲线。下面，我将给出我对<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A><A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=%D4%B4%C2%EB">源码</A>的划分方法。其实，我也是刚学习<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>没有多久，对<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>的了解还甚少，所以，我的<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=%D4%B4%C2%EB">源码</A>划方式法不一定十分正确，这里共享出来，仅供大家参考。</P>
<P>其实，在<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>的帮助文档里，<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>-subsets.html和<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>-categories.html，这两个文档对指导<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>的<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=%D4%B4%C2%EB">源码</A>划分起到了很大的作用，否则，我刚刚接触<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>，就想对其进行<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=%D4%B4%C2%EB">源码</A>划分，是不可能完成的。<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>-subsets.html，这个文档主要介绍了<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>的<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=library">library</A> <A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=subsetting">subsetting</A>。正常情况下，在编译完<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>后，只会产生一个<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>的库。我们可以根据该文档的介绍，简单的修改一下Makefile，就可以对<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>的库进行子集化，我们可以编译出OS、Thread等这样的子库。<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>-categories.html，这个文档对<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>中的代码进行了一些功能上的分类。具体大家可以详细的参考一下这两个文档，这两个文档对学习<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>还是有一定的帮助的。</P>
<P>在<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>的源代码目录ace下，我将建立很多子目录，来对<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>的代码进行按功能分类：</P>
<P><BR><A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>_OS：该目录里包含的代码是OS的API的wrapper，也就是<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>的OS适配层；<BR>&nbsp;包含代码：&nbsp;ARGV.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_Memory.cpp<BR>&nbsp;&nbsp;Argv_Type_Converter.cpp&nbsp;&nbsp;&nbsp;&nbsp;OS_QoS.cpp<BR>&nbsp;&nbsp;Base_Thread_Adapter.cpp&nbsp;&nbsp;&nbsp;&nbsp;OS_String.cpp<BR>&nbsp;&nbsp;Basic_Types.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_TLI.cpp<BR>&nbsp;&nbsp;Copy_Disabled.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_Thread_Adapter.cpp<BR>&nbsp;&nbsp;Env_Value_T.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sched_Params.cpp<BR>&nbsp;&nbsp;Handle_Set.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Template_Instantiations.cpp<BR>&nbsp;&nbsp;Makefile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread_Hook.cpp<BR>&nbsp;&nbsp;OS.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Time_Value.cpp<BR>&nbsp;&nbsp;OS_Dirent.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;OS_Errno.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;OS_Log_Msg_Attributes.cpp</P>
<P><A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>_Codec：该目录包含的是<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>的各种编码类型的处理代码，目前只包含了BASE64编码的处理；<BR>&nbsp;&nbsp;&nbsp; 包含代码：Codecs.cpp&nbsp;&nbsp;&nbsp;Makefile</P>
<P><BR><A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>_Connection：该目录包含的是<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>中的Acceptor-Connector框架代码和异步通讯类代码；<BR>&nbsp;&nbsp;包含代码：Acceptor.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connector.cpp<BR>&nbsp;&nbsp;&nbsp;Asynch_Acceptor.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Makefile<BR>&nbsp;&nbsp;&nbsp;Asynch_Connector.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;POSIX_Asynch_IO.cpp<BR>&nbsp;&nbsp;&nbsp;Asynch_IO.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Strategies_T.cpp<BR>&nbsp;&nbsp;&nbsp;Asynch_IO_Impl.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Svc_Handler.cpp<BR>&nbsp;&nbsp;&nbsp;Asynch_Pseudo_Task.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WIN32_Asynch_IO.cpp<BR>&nbsp;&nbsp;&nbsp;Cached_Connect_Strategy_T.cpp&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;Caching_Strategies_T.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P><A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>_Demux：该目录包含的是<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>中的Reactor和Proactor框架代码；<BR>&nbsp;&nbsp;&nbsp; 包含代码：Dev_Poll_Reactor.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Priority_Reactor.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TP_Reactor.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Event_Handler.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Proactor.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TkReactor.cpp<BR>&nbsp;&nbsp;Event_Handler_T.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QtReactor.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WFMO_Reactor.cpp<BR>&nbsp;&nbsp;FlReactor.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reactor.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WIN32_Proactor.cpp<BR>&nbsp;&nbsp;Makefile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUN_Proactor.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XtReactor.cpp<BR>&nbsp;&nbsp;Msg_WFMO_Reactor.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select_Reactor.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;POSIX_CB_Proactor.cpp&nbsp;&nbsp;&nbsp;&nbsp; Select_Reactor_Base.cpp&nbsp;&nbsp; <BR>&nbsp;&nbsp;POSIX_Proactor.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select_Reactor_T.cpp</P>
<P><A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>_IPC：该目录包含的是<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>中进程间通讯的一些封装代码：<BR>&nbsp; 包含代码：ATM_Acceptor.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Makefile<BR>&nbsp;&nbsp;ATM_Addr.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pipe.cpp<BR>&nbsp;&nbsp;ATM_Connector.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SPIPE.cpp<BR>&nbsp;&nbsp;ATM_Params.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SPIPE_Acceptor.cpp<BR>&nbsp;&nbsp;ATM_QoS.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SPIPE_Addr.cpp<BR>&nbsp;&nbsp;ATM_Stream.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SPIPE_Connector.cpp<BR>&nbsp;&nbsp;DEV.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SPIPE_Stream.cpp<BR>&nbsp;&nbsp;DEV_Addr.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SV_Message.cpp<BR>&nbsp;&nbsp;DEV_Connector.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SV_Message_Queue.cpp<BR>&nbsp;&nbsp;DEV_IO.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SV_Semaphore_Complex.cpp<BR>&nbsp;&nbsp;FIFO.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SV_Semaphore_Simple.cpp<BR>&nbsp;&nbsp;FIFO_Recv.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SV_Shared_Memory.cpp<BR>&nbsp;&nbsp;FIFO_Recv_Msg.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Signal.cpp<BR>&nbsp;&nbsp;FIFO_Send.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TLI.cpp<BR>&nbsp;&nbsp;FIFO_Send_Msg.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TLI_Acceptor.cpp<BR>&nbsp;&nbsp;FILE.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TLI_Connector.cpp<BR>&nbsp;&nbsp;FILE_Addr.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TLI_Stream.cpp<BR>&nbsp;&nbsp;FILE_Connector.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TTY_IO.cpp<BR>&nbsp;&nbsp;FILE_IO.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Typed_SV_Message.cpp<BR>&nbsp;&nbsp;IOStream.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Typed_SV_Message_Queue.cpp<BR>&nbsp;&nbsp;IOStream_T.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UNIX_Addr.cpp<BR>&nbsp;&nbsp;IO_SAP.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UPIPE_Acceptor.cpp<BR>&nbsp;&nbsp;MEM_Acceptor.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UPIPE_Connector.cpp<BR>&nbsp;&nbsp;MEM_Addr.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UPIPE_Stream.cpp<BR>&nbsp;&nbsp;MEM_Connector.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XTI_ATM_Mcast.cpp<BR>&nbsp;&nbsp;MEM_IO.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;MEM_SAP.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;MEM_Stream.cpp</P>
<P><A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>_LIB：该目录将包含<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>编译好的各个子库；</P>
<P><A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>_Logging：该目录包含<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>中的日志处理相关代码；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包含代码：Dump.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log_Msg_UNIX_Syslog.cpp<BR>&nbsp;&nbsp;Dump_T.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log_Record.cpp<BR>&nbsp;&nbsp;Log_Msg.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Logging_Strategy.cpp<BR>&nbsp;&nbsp;Log_Msg_Backend.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Makefile<BR>&nbsp;&nbsp;Log_Msg_Callback.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Trace.cpp<BR>&nbsp;&nbsp;Log_Msg_IPC.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;Log_Msg_NT_Event_Log.cpp&nbsp;&nbsp; </P>
<P><A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>_Memory：该目录包含了<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>内存处理相关代码；<BR>&nbsp;&nbsp;&nbsp;&nbsp; 包含代码：Based_Pointer_Repository.cpp&nbsp;&nbsp; Obstack.cpp<BR>&nbsp;&nbsp;Based_Pointer_T.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Obstack_T.cpp<BR>&nbsp;&nbsp;Makefile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PI_Malloc.cpp<BR>&nbsp;&nbsp;Malloc.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Read_Buffer.cpp<BR>&nbsp;&nbsp;Malloc_Allocator.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Shared_Memory.cpp<BR>&nbsp;&nbsp;Malloc_Instantiations.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Shared_Memory_MM.cpp<BR>&nbsp;&nbsp;Malloc_T.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Shared_Memory_SV.cpp<BR>&nbsp;&nbsp;Mem_Map.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;Memory_Pool.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;Obchunk.cpp</P>
<P><A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>_Misc：<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>中一些没有明确功能分类的代码，属于杂项；<BR>&nbsp;&nbsp; 包含代码：CE_Screen_Output.cpp&nbsp;&nbsp; NT_Service.cpp<BR>&nbsp;&nbsp;Makefile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gethrtime.cpp</P>
<P><A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>_Nameservices：该目录包含了<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>中名字服务相关代码；<BR>&nbsp;&nbsp;&nbsp; 包含代码： Name_Space.cpp<BR>&nbsp;&nbsp;&nbsp;Local_Name_Space.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Naming_Context.cpp<BR>&nbsp;&nbsp;&nbsp;Local_Name_Space_T.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Registry_Name_Space.cpp<BR>&nbsp;&nbsp;&nbsp;Makefile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Remote_Name_Space.cpp<BR>&nbsp;&nbsp;&nbsp;Name_Proxy.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;Name_Request_Reply.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P><A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>_Sockets：该目录包含的是<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>的socket封装代码；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包含代码：Addr.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOCK_CODgram.cpp<BR>&nbsp;&nbsp;INET_Addr.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOCK_Connector.cpp<BR>&nbsp;&nbsp;IPC_SAP.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOCK_Dgram.cpp<BR>&nbsp;&nbsp;LOCK_SOCK_Acceptor.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOCK_Dgram_Bcast.cpp<BR>&nbsp;&nbsp;LSOCK.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOCK_Dgram_Mcast.cpp<BR>&nbsp;&nbsp;LSOCK_Acceptor.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOCK_IO.cpp<BR>&nbsp;&nbsp;LSOCK_CODgram.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOCK_SEQPACK_Acceptor.cpp<BR>&nbsp;&nbsp;LSOCK_Connector.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOCK_SEQPACK_Association.cpp<BR>&nbsp;&nbsp;LSOCK_Dgram.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOCK_SEQPACK_Connector.cpp<BR>&nbsp;&nbsp;LSOCK_Stream.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOCK_Stream.cpp<BR>&nbsp;&nbsp;Makefile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sock_Connect.cpp<BR>&nbsp;&nbsp;Multihomed_INET_Addr.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;SOCK.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;SOCK_Acceptor.cpp</P>
<P><A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>_Streams：该目录包含了<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>中的Streams和Task框架代码；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包含代码：CDR_Base.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Module.cpp<BR>&nbsp;&nbsp;CDR_Stream.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Multiplexor.cpp<BR>&nbsp;&nbsp;Codeset_IBM1047.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Reactor_Notification_Strategy.cpp<BR>&nbsp;&nbsp;Codeset_Registry.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Stream.cpp<BR>&nbsp;&nbsp;Codeset_Registry_db.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Stream_Modules.cpp<BR>&nbsp;&nbsp;IO_Cntl_Msg.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Task.cpp<BR>&nbsp;&nbsp;Makefile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Task_T.cpp<BR>&nbsp;&nbsp;Message_Queue.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;Message_Queue_T.cpp&nbsp;&nbsp;&nbsp; </P>
<P><A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>_Svcconf：该目录包含了<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>中的Service Configurator框架代码；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包含代码：DLL.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Service_Types.cpp<BR>&nbsp;&nbsp;DLL_Manager.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Shared_Object.cpp<BR>&nbsp;&nbsp;Dynamic_Service.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Svc_Conf.l<BR>&nbsp;&nbsp;Dynamic_Service_Base.cpp&nbsp;&nbsp; Svc_Conf.y<BR>&nbsp;&nbsp;Makefile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Svc_Conf_Lexer_Guard.cpp<BR>&nbsp;&nbsp;Parse_Node.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Svc_Conf_l.cpp<BR>&nbsp;&nbsp;Service_Config.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Svc_Conf_y.cpp<BR>&nbsp;&nbsp;Service_Manager.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XML_Svc_Conf.cpp<BR>&nbsp;&nbsp;Service_Object.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;Service_Repository.cpp&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;Service_Templates.cpp</P>
<P><A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>_Threads：该目录包含了<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>中的线程和同步机制相关代码，例如：thread manager;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包含代码：Activation_Queue.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Process_Manager.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.cpp<BR>&nbsp;&nbsp;Atomic_Op.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Process_Mutex.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread_Adapter.cpp<BR>&nbsp;&nbsp;Atomic_Op_T.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Process_Semaphore.cpp&nbsp;&nbsp;&nbsp;&nbsp; Thread_Control.cpp<BR>&nbsp;&nbsp;File_Lock.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RW_Process_Mutex.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread_Exit.cpp<BR>&nbsp;&nbsp;Future.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Synch.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread_Manager.cpp<BR>&nbsp;&nbsp;Future_Set.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Synch_Options.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Token.cpp<BR>&nbsp;&nbsp;Makefile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Synch_T.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;Process.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Test_and_Set.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P><A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>_Timer：该目录包含<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>中和时间相关的代码；<BR>&nbsp;&nbsp;&nbsp;&nbsp; 包含代码：Timer_Heap.cpp<BR>&nbsp;&nbsp;Basic_Stats.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Timer_Heap_T.cpp<BR>&nbsp;&nbsp;High_Res_Timer.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Timer_List.cpp<BR>&nbsp;&nbsp;Makefile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Timer_List_T.cpp<BR>&nbsp;&nbsp;Profile_Timer.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Timer_Queue.cpp<BR>&nbsp;&nbsp;System_Time.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Timer_Queue_Adapters.cpp<BR>&nbsp;&nbsp;Time_Request_Reply.cpp&nbsp;&nbsp;&nbsp;&nbsp; Timer_Queue_T.cpp<BR>&nbsp;&nbsp;Timeprobe.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Timer_Wheel.cpp<BR>&nbsp;&nbsp;Timeprobe_T.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Timer_Wheel_T.cpp<BR>&nbsp;&nbsp;Timer_Hash.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;Timer_Hash_T.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P><A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>_Token：Token是<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>中实现的一种同步机制，保证严格的FIFO或LIFO策略来获得锁。<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>通过Token机制实现了分布式同步机制。<BR>&nbsp;&nbsp;&nbsp;&nbsp; 包含代码：Local_Tokens.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Token_Collection.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Token_Request_Reply.cpp<BR>&nbsp;&nbsp;Makefile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Token_Invariants.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;Remote_Tokens.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Token_Manager.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P><A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>_Utils：<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>中的一些基础数据结构和算法的工具类代码；<BR>&nbsp;&nbsp;&nbsp; 包含代码：<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Init_<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>.cpp<BR>&nbsp;&nbsp;Active_Map_Manager.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Intrusive_List.cpp<BR>&nbsp;&nbsp;Active_Map_Manager_T.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Intrusive_List_Node.cpp<BR>&nbsp;&nbsp;Arg_Shifter.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lib_Find.cpp<BR>&nbsp;&nbsp;Array_Base.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Makefile<BR>&nbsp;&nbsp;Auto_IncDec_T.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Managed_Object.cpp<BR>&nbsp;&nbsp;Auto_Ptr.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map.cpp<BR>&nbsp;&nbsp;Cache_Map_Manager_T.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map_Manager.cpp<BR>&nbsp;&nbsp;Caching_Utility_T.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map_T.cpp<BR>&nbsp;&nbsp;Capabilities.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message_Block.cpp<BR>&nbsp;&nbsp;Cleanup_Strategies_T.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message_Block_T.cpp<BR>&nbsp;&nbsp;Configuration.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method_Request.cpp<BR>&nbsp;&nbsp;Configuration_Import_Export.cpp&nbsp;&nbsp;&nbsp;&nbsp; Node.cpp<BR>&nbsp;&nbsp;Connection_Recycling_Strategy.cpp&nbsp;&nbsp; Notification_Strategy.cpp<BR>&nbsp;&nbsp;Containers.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object_Manager.cpp<BR>&nbsp;&nbsp;Containers_T.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pair.cpp<BR>&nbsp;&nbsp;Date_Time.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pair_T.cpp<BR>&nbsp;&nbsp;Dirent.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RB_Tree.cpp<BR>&nbsp;&nbsp;Dirent_Selector.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Recyclable.cpp<BR>&nbsp;&nbsp;Dynamic.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Refcountable.cpp<BR>&nbsp;&nbsp;Filecache.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Registry.cpp<BR>&nbsp;&nbsp;Flag_Manip.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SString.cpp<BR>&nbsp;&nbsp;Framework_Component.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sample_History.cpp<BR>&nbsp;&nbsp;Framework_Component_T.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Singleton.cpp<BR>&nbsp;&nbsp;Free_List.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Stats.cpp<BR>&nbsp;&nbsp;Functor.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String_Base.cpp<BR>&nbsp;&nbsp;Functor_T.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String_Base_Const.cpp<BR>&nbsp;&nbsp;Get_Opt.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Swap.cpp<BR>&nbsp;&nbsp;Handle_Ops.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Unbounded_Queue.cpp<BR>&nbsp;&nbsp;Hash_Cache_Map_Manager_T.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Unbounded_Set.cpp<BR>&nbsp;&nbsp;Hash_Map_Manager.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Unbounded_Set_Ex.cpp<BR>&nbsp;&nbsp;Hash_Map_Manager_T.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Vector_T.cpp<BR>&nbsp;&nbsp;Hash_Map_With_Allocator_T.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;Hashable.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>include：该目录又包含子目录ace，也就是说include/ace/目录下，包含了<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>的所有头文件和.i文件，之所以这样组织，是因为<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>中的源&nbsp;文件和头文件的包含文件的方式为：#include "ace/OS.h"，所以采用这种目录结构方式来存放头文件和.i文件。这里，对头文件和.i&nbsp;&nbsp;文件，没有进一步按照功能划分，就是因为#include "ace/OS.h"这种包含方式，如果头文件和.i文件也按照功能划分，那么代码修改&nbsp;量相当大；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>通过上面给出的目录结构和源文件功能划分及头文件组织方式，相信读者以可以自行对<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>代码进行整理了。在实际整理和编译代码的过程中，需要修改Makefile和<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>头文件中以_T方式为后缀的头文件，例如：Obstack_T.h，需要修改里面模板源文件包含路径。我将在下一篇文章中进行描述。</P>
<P>我再次强调，上面<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A><A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=%D4%B4%C2%EB">源码</A>划分方式，不一定十分正确^_^，随着我们<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>学习和理解的深入，我们可能会进行更改。其实，在我们整理<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>源文件的时候，我们可以进一步了解<A class=keyword href="http://sg.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=ACE">ACE</A>的各个源文件大致功能，对我们以后更深入的学习大有裨益。</P><img src ="http://www.cppblog.com/gnupython/aggbug/3534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gnupython/" target="_blank">heart in the world</a> 2006-02-26 22:04 <a href="http://www.cppblog.com/gnupython/archive/2006/02/26/3534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BLOG开张致辞！</title><link>http://www.cppblog.com/gnupython/archive/2005/12/27/2198.html</link><dc:creator>heart in the world</dc:creator><author>heart in the world</author><pubDate>Tue, 27 Dec 2005 15:06:00 GMT</pubDate><guid>http://www.cppblog.com/gnupython/archive/2005/12/27/2198.html</guid><wfw:comment>http://www.cppblog.com/gnupython/comments/2198.html</wfw:comment><comments>http://www.cppblog.com/gnupython/archive/2005/12/27/2198.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gnupython/comments/commentRss/2198.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gnupython/services/trackbacks/2198.html</trackback:ping><description><![CDATA[致力于C/C++开发,致力于标准库,跨平台应用,致力于STL,ACE解决问题,致力于P2P网络领域研究!<img src ="http://www.cppblog.com/gnupython/aggbug/2198.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gnupython/" target="_blank">heart in the world</a> 2005-12-27 23:06 <a href="http://www.cppblog.com/gnupython/archive/2005/12/27/2198.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>