<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>润物无声 &#187; C</title>
	<atom:link href="http://blog.zhourunsheng.com/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.zhourunsheng.com</link>
	<description>天空一朵雨做的云</description>
	<lastBuildDate>Sat, 08 May 2021 05:17:21 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.41</generator>
	<item>
		<title>备忘：C与C++之间的互相调用</title>
		<link>http://blog.zhourunsheng.com/2013/09/%e5%a4%87%e5%bf%98%ef%bc%9ac%e4%b8%8ec%e4%b9%8b%e9%97%b4%e7%9a%84%e4%ba%92%e7%9b%b8%e8%b0%83%e7%94%a8/</link>
		<comments>http://blog.zhourunsheng.com/2013/09/%e5%a4%87%e5%bf%98%ef%bc%9ac%e4%b8%8ec%e4%b9%8b%e9%97%b4%e7%9a%84%e4%ba%92%e7%9b%b8%e8%b0%83%e7%94%a8/#comments</comments>
		<pubDate>Fri, 20 Sep 2013 06:03:12 +0000</pubDate>
		<dc:creator><![CDATA[润物无声]]></dc:creator>
				<category><![CDATA[程序设计]]></category>
		<category><![CDATA[C]]></category>

		<guid isPermaLink="false">http://blog.zhourunsheng.com/?p=1853</guid>
		<description><![CDATA[<p>最新在做Ubuntu上面的C++开发，其中用到了部分C库，那么就涉及到C和C++之间的混合调用，C++调用C语 [&#8230;]</p>
<p><a rel="nofollow" href="http://blog.zhourunsheng.com/2013/09/%e5%a4%87%e5%bf%98%ef%bc%9ac%e4%b8%8ec%e4%b9%8b%e9%97%b4%e7%9a%84%e4%ba%92%e7%9b%b8%e8%b0%83%e7%94%a8/">备忘：C与C++之间的互相调用</a>，首发于<a rel="nofollow" href="http://blog.zhourunsheng.com">润物无声</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>最新在做Ubuntu上面的C++开发，其中用到了部分C库，那么就涉及到C和C++之间的混合调用，C++调用C语言比较方便，反之则要稍作变通。</p>
<h2>1. C++ 调用 C 语言</h2>
<p>头文件包含：</p>
<pre>extern "C"
{
#include "iec61850_server.h"
#include "iso_server.h"
#include "acse.h"
#include "thread.h"
#include "model.h"
}</pre>
<p>函数调用：</p>
<pre>IedServer_observeDataAttribute(iedServer, (DataAttribute*)mmsi.dmm, observerCallback);</pre>
<p>回调函数observerCallback的声明和实现如下：</p>
<pre>extern "C"
{
  void observerCallback(DataAttribute* dataAttribute)
  {
    call_Lib_daObserverCallback(mod, dataAttribute);
  }
}</pre>
<h2>2. C 调用 C++ 语言</h2>
<p>在C语言的函数中是无法直接调用C++代码的，如果要调用，需要做一个wrapper，例如call_Lib_daObserverCallback，它的声明和实现如下：</p>
<pre>extern "C" void call_Lib_daObserverCallback(Lib* p, DataAttribute* dataAttribute) // wrapper function
{
   p-&gt;daObserverCallback(dataAttribute);
}</pre>
<p>daObserverCallback 才是我们C++代码的实现：</p>
<pre>void Lib::daObserverCallback(DataAttribute* dataAttribute)
{
  map&lt;string, MMSINFO&gt;::iterator it;
  // ...
}</pre>
<p><a rel="nofollow" href="http://blog.zhourunsheng.com/2013/09/%e5%a4%87%e5%bf%98%ef%bc%9ac%e4%b8%8ec%e4%b9%8b%e9%97%b4%e7%9a%84%e4%ba%92%e7%9b%b8%e8%b0%83%e7%94%a8/">备忘：C与C++之间的互相调用</a>，首发于<a rel="nofollow" href="http://blog.zhourunsheng.com">润物无声</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zhourunsheng.com/2013/09/%e5%a4%87%e5%bf%98%ef%bc%9ac%e4%b8%8ec%e4%b9%8b%e9%97%b4%e7%9a%84%e4%ba%92%e7%9b%b8%e8%b0%83%e7%94%a8/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
