﻿<?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++博客-Jacky Loves C++-随笔分类-C++</title><link>http://www.cppblog.com/jacky2019/category/3690.html</link><description>Next to my life, software is my passion.</description><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 14:20:56 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 14:20:56 GMT</pubDate><ttl>60</ttl><item><title>python与c++交互学习入门之5</title><link>http://www.cppblog.com/jacky2019/archive/2007/06/06/25662.html</link><dc:creator>小熊</dc:creator><author>小熊</author><pubDate>Wed, 06 Jun 2007 08:25:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/06/06/25662.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/25662.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/06/06/25662.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/25662.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/25662.html</trackback:ping><description><![CDATA[<p>这次讲讲，如何扩展c++库。通过boost.python把c++库编译成python能够调用的dll。</p>
<p><br>通过上一次的教程后，大家都应该会使用boost.python了。把c++程序编译成pyd文件。由于c++有很多特性，所以，如果你的程</p>
<p>序用了很多的c++特性的话，那么你必须做很多工作了。像虚拟函数，函数重载，继承，默认值等等。具体如何转化，请参</p>
<p>boost.python的文档了。</p>
<p><br>这几天尝试着把c++程序库编译成python可调用的dll，不知道为什么一直不可用。。很是郁闷。老是显示如下的错误：</p>
<p>Traceback (most recent call last):<br>&nbsp; File "&lt;pyshell#3&gt;", line 1, in &lt;module&gt;<br>&nbsp;&nbsp;&nbsp; import pydll<br>ImportError: No module named pydll</p>
<p>意思是说找不到dll。我把dll都copy到python/dlls下了还是不行，而且我确定python的sys.path包含了python/dlls目录了。</p>
<p>很是不解。网上也很难找到资料，google了很长时间找不到有用的资料，好像中文方面的资料很少的。今天尝试了一下google</p>
<p>英文资料，终于有了新的发现：<br><a href="http://mail.python.org/pipermail/c++-sig/2007-February/011971.html">http://mail.python.org/pipermail/c++-sig/2007-February/011971.html</a><br>You are using Python2.5. In this version of Python you have to have<br>file extension<br>to be "pyd" - sge.pyd</p>
<p>-- <br>Roman Yakovenko<br>C++ Python language binding<br><a href="http://www.language-binding.net/">http://www.language-binding.net/</a></p>
<p>有人碰到的问题跟我的是一样的。后面那个Roman回答了一下，是文件扩展名的问题！！！为什么不支持dll呢？不解。回去试</p>
<p>了一下把后缀名改了就成功了。。。why???</p>
<p><br>下面来看一下我的那个简单的例子：<br>这个例子来自于网上，<br><a href="http://www.vckbase.com/document/viewdoc/?id=1540">http://www.vckbase.com/document/viewdoc/?id=1540</a><br>C++ 扩展和嵌入 Python<br>作者：胡金山<br>源码下载地址：<a href="http://www.vckbase.com/code/downcode.asp?id=2777">http://www.vckbase.com/code/downcode.asp?id=2777</a></p>
<p><br>这是一个非常简单的dll工程。给python提供了一个函数static PyObject* Recognise(PyObject *self, PyObject *args)。</p>
<p><br>1、不使用boost.python库来直接构建dll<br>接下来，我们来用C++为Python编写扩展模块(动态链接库)，并在Python程序中调用C++开发的扩展功能函数。生成一个取名为</p>
<p>pyUtil的Win32 DLL工程，除了pyUtil.cpp文件以外，从工程中移除所有其它文件，并填入如下的代码： </p>
<p>// pyUtil.cpp<br>#ifdef PYUTIL_EXPORTS<br>#define PYUTIL_API __declspec(dllexport)<br>#else<br>#define PYUTIL_API __declspec(dllimport)<br>#endif</p>
<p>#include&lt;windows.h&gt;<br>#include&lt;string&gt;<br>#include&lt;Python.h&gt;<br>BOOL APIENTRY DllMain( HANDLE hModule, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD&nbsp; ul_reason_for_call, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPVOID lpReserved<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br>{<br>&nbsp;&nbsp;&nbsp; switch (ul_reason_for_call)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; case DLL_PROCESS_ATTACH:<br>&nbsp;&nbsp;&nbsp; case DLL_THREAD_ATTACH:<br>&nbsp;&nbsp;&nbsp; case DLL_THREAD_DETACH:<br>&nbsp;&nbsp;&nbsp; case DLL_PROCESS_DETACH:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return TRUE;<br>}<br>std::string Recognise_Img(const std::string url)<br>{<br>&nbsp;&nbsp;&nbsp; //返回结果<br>&nbsp;&nbsp;&nbsp; return "从dll中返回的数据... : " +url;<br>}<br>static PyObject* Recognise(PyObject *self, PyObject *args)<br>{<br>&nbsp;&nbsp;&nbsp; const char *url;<br>&nbsp;&nbsp;&nbsp; std::string sts;<br>&nbsp;&nbsp;&nbsp; if (!PyArg_ParseTuple(args, "s", &amp;url))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return NULL;<br>&nbsp;&nbsp;&nbsp; sts = Recognise_Img(url);<br>&nbsp;&nbsp;&nbsp; return Py_BuildValue("s", sts.c_str() );<br>}<br>static PyMethodDef AllMyMethods[] = {<br>&nbsp;&nbsp;&nbsp; {"Recognise",&nbsp; Recognise, METH_VARARGS},//暴露给Python的函数<br>&nbsp;&nbsp;&nbsp; {NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Sentinel */<br>};<br>extern "C" PYUTIL_API void initpyUtil()<br>{<br>&nbsp;&nbsp;&nbsp; PyObject *m, *d;<br>&nbsp;&nbsp;&nbsp; m = Py_InitModule("pyUtil", AllMyMethods); //初始化本模块，并暴露函数<br>&nbsp;&nbsp;&nbsp; d = PyModule_GetDict(m);<br>}</p>
<p>在Python代码中调用这个动态链接库： (记得把dll的扩展名改为.pyd，另外dll的路径要能够被检索到)<br>import pyUtil<br>result = pyUtil.Recognise("input url of specific data")<br>print "the result is: "+ result</p>
<p>&nbsp;</p>
<p>2、使用boost.python库来构建dll<br>用C++为Python写扩展时，如果您愿意使用Boost.Python库的话，开发过程会变得更开心J，要编写一个与上述pyUtil同样功能</p>
<p>的动态链接库，只需把文件内容替换为下面的代码。当然，编译需要boost_python.lib支持，运行需要boost_python.dll支持</p>
<p>。 <br>#include&lt;string&gt;<br>#include &lt;boost/python.hpp&gt;<br>using namespace boost::python;<br>#pragma comment(lib, "boost_python.lib")<br>std::string strtmp;<br>char const* Recognise(const char* url)<br>{<br>&nbsp;&nbsp;&nbsp; strtmp ="从dll中返回的数据... : ";<br>&nbsp;&nbsp;&nbsp; strtmp+=url;<br>&nbsp;&nbsp;&nbsp; return strtmp.c_str();<br>}<br>BOOST_PYTHON_MODULE(pyUtil)<br>{<br>&nbsp;&nbsp;&nbsp; def("Recognise", Recognise);<br>}</p>
<p>可以非常明显地看到，用了boost.python库之后，简单了很多。因为boost.python为你做了很多的事情。。恩。</p>
<p>&nbsp;</p>
<p>好像没有讲很多有用的东西，光顾着讲了，呵呵。。。我也还在继续学习之中。下次写点什么呢？继续学习了哦</p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/jacky2019/aggbug/25662.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">小熊</a> 2007-06-06 16:25 <a href="http://www.cppblog.com/jacky2019/archive/2007/06/06/25662.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++中嵌入python入门4 之 Boost.Python</title><link>http://www.cppblog.com/jacky2019/archive/2007/06/01/25254.html</link><dc:creator>小熊</dc:creator><author>小熊</author><pubDate>Fri, 01 Jun 2007 02:32:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/06/01/25254.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/25254.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/06/01/25254.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/25254.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/25254.html</trackback:ping><description><![CDATA[<p>坏境python25 + vs2005 (2005真耗资源阿。。。)</p>
<p>有一段时间没写blog了。这几天都在研究怎么封装c++，让python可以用c++的库。在网上发现了boost.python这个好咚咚。不</p>
<p>过在使用过程中碰到一点问题。本文教大家如何把</p>
<p>char const* greet()<br>{<br>&nbsp;&nbsp; return "hello, world";<br>}</p>
<p>封装成python。实际上这是python教程里面的咚咚。</p>
<p><br>首先下载Boost，<a href="http://www.boost.org/">www.boost.org</a>。boost.python在boost里面了。在visual studio 2005 command prompt中navigation到</p>
<p>boost\boost_1_34_0\下。记得一定要用visual studio 2005 command prompt这个vs2005带的tools，不要用cmd.exe，否则会</p>
<p>碰到很多错误的。然后就是把bjam.exe拷贝到一个能被找到的目录下，或者直接也拷贝到boost\boost_1_34_0\下即可。然后，</p>
<p>设置python的根目录和python的版本，也可直接把它们加到坏境目录中，那样就不用每次都设置一下。<br>set PYTHON_ROOT=c:/python25<br>set PYTHON_VERSION=2.5</p>
<p>接着就可以直接运行了，bjam -sTOOLS=vc-8_0<br>整个编译过程要很长时间。。。</p>
<p>成功之后，就会有好多个boost_python-vc80-****.dll,.lib的，把他们都拷贝到一个能被系统找到的目录，不妨直接把他们都</p>
<p>扔到c:\windows\system32下。</p>
<p>接着，我们开始编译hello。navigation到boost\boost_1_34_0\libs\python\example\tutorial下，bjam -sTOOLS=vc-8_0运行</p>
<p>，在bin的目录下即会生成hello.pyd。这下就基本成功了，如果没成功的话，check一下上面boost_python的那些dll能否被系</p>
<p>统找到。另外，这里有python25的一个bug。。。我花了很长时间才在python的mail lists中找到了。寒。。。</p>
<p>错误如下所示：<br>D:\Learn\Python\boost\boost_1_34_0\libs\python\example\tutorial&gt;bjam<br>Jamroot:17: in modules.load<br>rule python-extension unknown in module Jamfile&lt;/D:/Learn/Python/boost/boost_1_3<br>4_0/libs/python/example/tutorial&gt;.<br>D:/Learn/Python/boost/boost_1_34_0/tools/build/v2/build\project.jam:312: in load<br>-jamfile<br>D:/Learn/Python/boost/boost_1_34_0/tools/build/v2/build\project.jam:68: in load<br>D:/Learn/Python/boost/boost_1_34_0/tools/build/v2/build\project.jam:170: in proj<br>ect.find<br>D:/Learn/Python/boost/boost_1_34_0/tools/build/v2\build-system.jam:237: in load<br>D:\Learn\Python\boost\boost_1_34_0\libs\python\example\..\..\..\tools\build\v2/k<br>ernel\modules.jam:261: in import<br>D:\Learn\Python\boost\boost_1_34_0\libs\python\example\..\..\..\tools\build\v2/k<br>ernel/bootstrap.jam:132: in boost-build<br>D:\Learn\Python\boost\boost_1_34_0\libs\python\example\boost-build.jam:7: in mod<br>ule scope</p>
<p>解决办法如下：<br>在boost\boost_1_34_0\tools\build\v2\目录下找到user-config.jam文件，打开在<br>import toolset : using ;<br>下面加一行代码：<br>using python ;<br>再重新编译一下boost，然后就没问题了。tutorial里面的hello能顺利编译通过。ps.这个问题困扰了我好长时间。。sigh。。</p>
<p>。</p>
<p>编译成功后会产生一个hello.pyd，在bin的目录下面。</p>
<p><br>有好多办法测试此hello.pyd是否可以用。<br>方法一，把它拷贝到python25\dlls下，打开IDLE，<br>&gt;&gt;&gt; import hello<br>&gt;&gt;&gt; hello.greet()<br>'hello, world'<br>&gt;&gt;&gt; <br>方法二，直接在当前目录下写一个python文件，然后直接调用hello.pyd即可。总之，hello.pyd就是一个python文件了。。嗯</p>
<p>。操作hello.pyd根其他python文件是一样的。<br>这样就成功了。</p>
<p>如果碰到如下错误，是因为系统找不到boost_python的dll。强烈建议把他们都扔到system32下！。</p>
<p>&gt;&gt;&gt; import hello</p>
<p>Traceback (most recent call last):<br>&nbsp; File "&lt;pyshell#0&gt;", line 1, in &lt;module&gt;<br>&nbsp;&nbsp;&nbsp; import hello<br>ImportError: DLL load failed: 找不到指定的模块。<br>&gt;&gt;&gt; </p>
<p><br>说明，hello.cpp在boost\boost_1_34_0\libs\python\example\tutorial目录下。里面的内容是：</p>
<p>//&nbsp; Copyright Joel de Guzman 2002-2004. Distributed under the Boost<br>//&nbsp; Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt <br>//&nbsp; or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</a>)<br>//&nbsp; Hello World Example from the tutorial<br>//&nbsp; [Joel de Guzman 10/9/2002]</p>
<p>char const* greet()<br>{<br>&nbsp;&nbsp; return "hello, world";<br>}</p>
<p>#include &lt;boost/python/module.hpp&gt;<br>#include &lt;boost/python/def.hpp&gt;<br>using namespace boost::python;</p>
<p>BOOST_PYTHON_MODULE(hello)<br>{<br>&nbsp;&nbsp;&nbsp; def("greet", greet);<br>}</p>
<p><br>其中<br>BOOST_PYTHON_MODULE(hello)<br>{<br>&nbsp;&nbsp;&nbsp; def("greet", greet);<br>}<br>是对greet从c++向python的一个封装声明吧，装换就交给boost了。</p>
<p>&nbsp;</p>
<p>先写到这里了。下次再写。。嗯<br></p>
<img src ="http://www.cppblog.com/jacky2019/aggbug/25254.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">小熊</a> 2007-06-01 10:32 <a href="http://www.cppblog.com/jacky2019/archive/2007/06/01/25254.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++中嵌入python入门3</title><link>http://www.cppblog.com/jacky2019/archive/2007/05/17/24286.html</link><dc:creator>小熊</dc:creator><author>小熊</author><pubDate>Thu, 17 May 2007 07:16:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/05/17/24286.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/24286.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/05/17/24286.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/24286.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/24286.html</trackback:ping><description><![CDATA[<p>这次主要讲讲怎么把python中的class嵌入到c++中去。<br>顺便讲讲元组的操作和怎么编译python源代码。</p>
<p>1. 首先讲讲元组的操作<br>由于参数是通过元组传进去的，所以我们不能老是通过Py_BuildValue这个函数来操作元组，那样太不方便了。<br>Python提供了元组相关的操作，下面这个例子演示了如何操作。主要是下面几个函数：<br>//new一个元组，传入size<br>pArgs = PyTuple_New(argc - 3);&nbsp;<br>//set元组的直，第一个为元组，第二个为index（从0开始），第三个为value<br>PyTuple_SetItem(pArgs,0,Py_BuildValue("i",2000) );<br>PyTuple_SetItem(pArgs,1,Py_BuildValue("i",8) );</p>
<p>来自python doc的一个例子</p>
<p>#include &lt;Python.h&gt;<br>int<br>main(int argc, char *argv[])<br>{<br>&nbsp;&nbsp;&nbsp; PyObject *pName, *pModule, *pDict, *pFunc;<br>&nbsp;&nbsp;&nbsp; PyObject *pArgs, *pValue;<br>&nbsp;&nbsp;&nbsp; int i;</p>
<p>&nbsp;&nbsp;&nbsp; if (argc &lt; 3) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr,"Usage: call pythonfile funcname [args]\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; Py_Initialize();<br>&nbsp;&nbsp;&nbsp; pName = PyString_FromString(argv[1]);<br>&nbsp;&nbsp;&nbsp; /* Error checking of pName left out */</p>
<p>&nbsp;&nbsp;&nbsp; pModule = PyImport_Import(pName);<br>&nbsp;&nbsp;&nbsp; Py_DECREF(pName);</p>
<p>&nbsp;&nbsp;&nbsp; if (pModule != NULL) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pFunc = PyObject_GetAttrString(pModule, argv[2]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* pFunc is a new reference */</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (pFunc &amp;&amp; PyCallable_Check(pFunc)) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pArgs = PyTuple_New(argc - 3);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; argc - 3; ++i) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pValue = PyInt_FromLong(atoi(argv[i + 3]));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!pValue) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Py_DECREF(pArgs);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Py_DECREF(pModule);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr, "Cannot convert argument\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* pValue reference stolen here: */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PyTuple_SetItem(pArgs, i, pValue);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pValue = PyObject_CallObject(pFunc, pArgs);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Py_DECREF(pArgs);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (pValue != NULL) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Result of call: %ld\n", PyInt_AsLong(pValue));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Py_DECREF(pValue);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Py_DECREF(pFunc);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Py_DECREF(pModule);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PyErr_Print();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr,"Call failed\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (PyErr_Occurred())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PyErr_Print();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr, "Cannot find function \"%s\"\n", argv[2]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Py_XDECREF(pFunc);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Py_DECREF(pModule);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PyErr_Print();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr, "Failed to load \"%s\"\n", argv[1]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; Py_Finalize();<br>&nbsp;&nbsp;&nbsp; return 0;<br>}</p>
<p><br>2. class操作<br>把下面加入到test2.py中去。定义了一个很简单的类，有一个name成员变量，一个printName成员函数<br>class TestClass:<br>&nbsp;&nbsp;&nbsp; def __init__(self,name):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.name = name</p>
<p>&nbsp;&nbsp;&nbsp; def printName(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print self.name</p>
<p>cpp文件<br>#include &lt;python.h&gt;<br>int main()<br>{<br>&nbsp;Py_Initialize();</p>
<p>&nbsp;PyObject * pModule = NULL;<br>&nbsp;PyObject * pFunc&nbsp;&nbsp; = NULL;<br>&nbsp;PyObject * pArg&nbsp;&nbsp;&nbsp; = NULL;<br>&nbsp;PyObject * pClass&nbsp; = NULL;<br>&nbsp;PyObject * pObject = NULL;</p>
<p>&nbsp;pModule = PyImport_ImportModule("test2");<br>&nbsp;pClass&nbsp; = PyObject_GetAttrString(pModule, "TestClass");//得到那个类<br>&nbsp;pArg = PyTuple_New(1);<br>&nbsp;PyTuple_SetItem(pArg, 0, Py_BuildValue("s", "Jacky"));<br>&nbsp;pObject = PyEval_CallObject(pClass, pArg);//生成一个对象，或者叫作实例</p>
<p>&nbsp;pFunc = PyObject_GetAttrString(pObject, "printName");//得到该实例的成员函数<br>&nbsp;PyEval_CallObject(pFunc, NULL);//执行该实例的成员函数</p>
<p>&nbsp;Py_Finalize();</p>
<p>&nbsp;return 0;<br>}</p>
<p><br>没有什么资料，就先写到这里了。下面介绍一下怎么build python25的源代码</p>
<p>3. 编译python源代码<br>为什么要编译呢？因为没有python25_d.lib！呵呵。顺便可以了解一下代码结构。<br>解压缩后，有好多目录，其中pcbuild和pcbuild8是我们要的。pcbuild对应着vc7.1的,pcbuild8对应着vc8.0的<br>因为在用vc7.1，也就是2003了。所以我就说说怎么用2003来编译吧。事实上是从一位牛人那里学来的</p>
<p><a href="http://blog.donews.com/lemur/archive/2005/12/17/660973.aspx">http://blog.donews.com/lemur/archive/2005/12/17/660973.aspx</a>，那位大哥大概一年半前就在解剖python了，厉害</p>
<p>阿。看来我只能后来居上了，娃哈哈。我按照他说的试了一下，编译成功！</p>
<p>不过遇到一点小问题，用vc2003打开那个solution的时候，发现作者没有把source code control去掉，郁闷！害的我</p>
<p>们打开的时候一堆messagebox。不过不用管它就好了，一直确定。最后试了一下那个python25_d.lib，没问题。不过记</p>
<p>得把python25_d.dll copy到一个能被找到的目录，比如说c:\windows\system32\下面。python25.dll也在这个目录下</p>
<p>面。over。恩。</p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/jacky2019/aggbug/24286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">小熊</a> 2007-05-17 15:16 <a href="http://www.cppblog.com/jacky2019/archive/2007/05/17/24286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++中嵌入python入门2</title><link>http://www.cppblog.com/jacky2019/archive/2007/05/17/24276.html</link><dc:creator>小熊</dc:creator><author>小熊</author><pubDate>Thu, 17 May 2007 03:28:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/05/17/24276.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/24276.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/05/17/24276.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/24276.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/24276.html</trackback:ping><description><![CDATA[<p>1. 一个有一个参数的例子</p>
<p>python文件<br>#Filename test2.py</p>
<p>def Hello(s):<br>&nbsp;&nbsp;&nbsp; print "Hello, world!"<br>&nbsp;&nbsp;&nbsp; print s</p>
<p>cpp文件<br>#include &lt;python.h&gt;<br>int main()<br>{<br>&nbsp;Py_Initialize();</p>
<p>&nbsp;PyObject * pModule = NULL;<br>&nbsp;PyObject * pFunc&nbsp;&nbsp; = NULL;<br>&nbsp;PyObject * pArg&nbsp;&nbsp;&nbsp; = NULL;</p>
<p>&nbsp;pModule = PyImport_ImportModule("test2");<br>&nbsp;pFunc&nbsp;&nbsp; = PyObject_GetAttrString(pModule, "Hello");<br>&nbsp;pArg&nbsp;&nbsp;&nbsp; = Py_BuildValue("(s)", "function with argument");</p>
<p>&nbsp;PyEval_CallObject(pFunc, pArg);</p>
<p>&nbsp;Py_Finalize();</p>
<p>&nbsp;return 0;<br>}</p>
<p>注意，参数要以tuple元组形式传入。因为这个函数只要一个参数，所以我们直接使用(s)构造一个元组了。</p>
<p>2. 一个有两个参数的例子</p>
<p>python文件中加入以下代码，一个加函数<br>def Add(a, b):<br>&nbsp;&nbsp;&nbsp; print "a+b=", a+b</p>
<p>cpp文件，只改了两行，有注释的那两行<br>#include &lt;python.h&gt;<br>int main()<br>{<br>&nbsp;Py_Initialize();</p>
<p>&nbsp;PyObject * pModule = NULL;<br>&nbsp;PyObject * pFunc&nbsp;&nbsp; = NULL;<br>&nbsp;PyObject * pArg&nbsp;&nbsp;&nbsp; = NULL;</p>
<p>&nbsp;pModule = PyImport_ImportModule("test2");<br>&nbsp;pFunc&nbsp;&nbsp; = PyObject_GetAttrString(pModule, "Add");//终于告别hello world了，开始使用新的函数<br>&nbsp;pArg&nbsp;&nbsp;&nbsp; = Py_BuildValue("(i,i)", 10, 15);//构造一个元组</p>
<p>&nbsp;PyEval_CallObject(pFunc, pArg);</p>
<p>&nbsp;Py_Finalize();</p>
<p>&nbsp;return 0;<br>}</p>
<p>其它的就类似了。。。基本上，我们知道了怎么在c++中使用python中的函数。接下来学习一下如何使用python中的</p>
<p>class。</p>
<p>附：Py_BuildValue的使用例子，来自python documentation：</p>
<p>&nbsp;&nbsp;&nbsp; Py_BuildValue("")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; None<br>&nbsp;&nbsp;&nbsp; Py_BuildValue("i", 123)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 123<br>&nbsp;&nbsp;&nbsp; Py_BuildValue("iii", 123, 456, 789)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (123, 456, 789)<br>&nbsp;&nbsp;&nbsp; Py_BuildValue("s", "hello")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'hello'<br>&nbsp;&nbsp;&nbsp; Py_BuildValue("ss", "hello", "world")&nbsp;&nbsp;&nbsp; ('hello', 'world')<br>&nbsp;&nbsp;&nbsp; Py_BuildValue("s#", "hello", 4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'hell'<br>&nbsp;&nbsp;&nbsp; Py_BuildValue("()")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ()<br>&nbsp;&nbsp;&nbsp; Py_BuildValue("(i)", 123)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (123,)<br>&nbsp;&nbsp;&nbsp; Py_BuildValue("(ii)", 123, 456)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (123, 456)<br>&nbsp;&nbsp;&nbsp; Py_BuildValue("(i,i)", 123, 456)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (123, 456)<br>&nbsp;&nbsp;&nbsp; Py_BuildValue("[i,i]", 123, 456)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [123, 456]<br>&nbsp;&nbsp;&nbsp; Py_BuildValue("{s:i,s:i}",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "abc", 123, "def", 456)&nbsp;&nbsp;&nbsp; {'abc': 123, 'def': 456}<br>&nbsp;&nbsp;&nbsp; Py_BuildValue("((ii)(ii)) (ii)",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1, 2, 3, 4, 5, 6)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (((1, 2), (3, 4)), (5, 6))<br></p>
<img src ="http://www.cppblog.com/jacky2019/aggbug/24276.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">小熊</a> 2007-05-17 11:28 <a href="http://www.cppblog.com/jacky2019/archive/2007/05/17/24276.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++中嵌入python入门1</title><link>http://www.cppblog.com/jacky2019/archive/2007/05/17/24269.html</link><dc:creator>小熊</dc:creator><author>小熊</author><pubDate>Thu, 17 May 2007 03:03:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/05/17/24269.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/24269.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/05/17/24269.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/24269.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/24269.html</trackback:ping><description><![CDATA[<p>本人是用vc2003+python2.5学习的，其它的也应该差不了多少</p>
<p>0. 坏境设置<br>把python的include/libs目录分别加到vc的include/lib directories中去。另外，由于python没有提供debug lib，体地说，就是没有提供python25_d.lib了。你可以自己编译python的源代码来得到python25_d.lib的，偶还没试过，呵呵。而且网上找了一下也没下载到。所以，如果你想要在debug下运行程序的话，你要把pyconfig.h（在python25/include/目录下）的大概是在283行，把pragma comment(lib,"python25_d.lib")改成pragma comment(lib,"python25.lib")，让python都使用非debug lib.</p>
<p>1. 开始编程了<br>#include &lt;python.h&gt;<br>第一步就是包含python的头文件</p>
<p>2. 看一个很简单的例子<br>1)python文件test.py，很简单的定义了一个函数</p>
<p>#Filename test.py<br>def Hello():<br>&nbsp;&nbsp;&nbsp; print "Hello, world!"</p>
<p>这个应该能看懂的吧？否则的话，回去再练练python吧，呵呵。《简明Python教程》Swaroop, C. H. 著。沈洁元&nbsp; 译。</p>
<p><br>2)cpp文件</p>
<p>#include &lt;python.h&gt; //包含头文件，在c++中嵌入python，这是必须的<br>int main()<br>{<br>&nbsp;Py_Initialize();</p>
<p>&nbsp;PyObject * pModule = NULL;<br>&nbsp;PyObject * pFunc&nbsp;&nbsp; = NULL;</p>
<p>&nbsp;pModule = PyImport_ImportModule("test");<br>&nbsp;pFunc&nbsp;&nbsp; = PyObject_GetAttrString(pModule, "Hello");<br>&nbsp;PyEval_CallObject(pFunc, NULL);</p>
<p>&nbsp;Py_Finalize();</p>
<p>&nbsp;return 0;<br>}</p>
<p>第一步还是包含头文件</p>
<p>第二步，使用python之前，要调用Py_Initialize();这个函数进行初始化。<br>帮助文档中如是说：<br>The basic initialization function is Py_Initialize(). This initializes the table of loaded modules, and creates the fundamental modules __builtin__, __main__, sys, and exceptions. It also initializes the module search path (sys.path). </p>
<p>反正，一开始你一定要调用。</p>
<p>第三步，声明一些Python的变量，PyObject类型的。其实声明也可放在前面，这个倒是无所谓的。</p>
<p>第四步，import module，也就是你的脚本名字，不需要加后缀名，否则会出错的。</p>
<p>第五步，从你import进来的module中得到你要的函数<br>&nbsp;pFunc&nbsp;&nbsp; = PyObject_GetAttrString(pModule, "Hello");<br>上面的例子已经够清楚的了，最后一个是你要得到的函数的名字</p>
<p>第六步，调用PyEval_CallObject来执行你的函数，第二个参数为我们要调用的函数的函数，本例子不含参数，所以设置为NULL。</p>
<p>第七步，调用Py_Finalize，这个根Py_Initialize相对应的。一个在最前面，一个在最后面。</p>
<p>&nbsp;</p>
<p>第一次写教程。这个例子非常简单，本人也还在学习当中阿，只能保证大家能够把这个例子运行起来。建议大家去看python的documentaion，里面有讲怎么embedding python的。先写到这里，其实目前也只学到这么多，呵呵。下次学了更多以后再写。Over。恩。</p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/jacky2019/aggbug/24269.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">小熊</a> 2007-05-17 11:03 <a href="http://www.cppblog.com/jacky2019/archive/2007/05/17/24269.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>认识理解volatile关键字</title><link>http://www.cppblog.com/jacky2019/archive/2007/04/04/21233.html</link><dc:creator>小熊</dc:creator><author>小熊</author><pubDate>Wed, 04 Apr 2007 06:15:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/04/04/21233.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/21233.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/04/04/21233.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/21233.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/21233.html</trackback:ping><description><![CDATA[<span>这个关键字告诉编译器不要持有变量的临时性拷贝。它可以适用于基础类型，如</span>int<span>或</span>long<span>，也适用于一整个</span>c<span>结构或</span>c++<span>类。</span>
<p><span>为什么要有这个关键字呢？因为编译器在优化的时候，会把常用到的数据放在</span>CPU<span>的内部寄存器中。数据从寄存器中读取，远比从内存中读取要快！但是，如果另一个线程改变了内存中的变量值，那么此变量在寄存器中的值就过期了。</span></p>
<script type=text/javascript>
    <!--
google_ad_client = "pub-6457474891690507";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
google_ad_channel = "";
//-->
  </script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
  </script>
<!-- Search Google -->
<center>
<form action=http://www.google.cn/custom method=get target=_top>
<table bgColor=#ffffff>
<tbody>
<tr>
<td vAlign=top noWrap align=left height=32><a href="http://www.google.com/"><img alt=Google src="http://www.google.com/logos/Logo_25wht.gif" align=middle border=0> </a><label style="DISPLAY: none" for=sbi>输入您的搜索字词</label> <input id=sbi maxLength=255 size=31 name=q> <label style="DISPLAY: none" for=sbb>提交搜索表单</label> <input id=sbb type=submit value=搜索 name=sa> <input type=hidden value=pub-6457474891690507 name=client> <input type=hidden value=1 name=forid> <input type=hidden value=GB2312 name=ie> <input type=hidden value=GB2312 name=oe> <input type=hidden value=GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;FORID:1 name=cof> <input type=hidden value=zh-CN name=hl> </td></tr></tbody></table></form></center><!-- Search Google --><img src ="http://www.cppblog.com/jacky2019/aggbug/21233.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">小熊</a> 2007-04-04 14:15 <a href="http://www.cppblog.com/jacky2019/archive/2007/04/04/21233.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>链接器都干了些什么？</title><link>http://www.cppblog.com/jacky2019/archive/2007/03/29/20891.html</link><dc:creator>小熊</dc:creator><author>小熊</author><pubDate>Thu, 29 Mar 2007 11:10:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/03/29/20891.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/20891.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/03/29/20891.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/20891.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/20891.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 目前项目在不停的增长，我想还是在它规模仍旧很小的时候把它的模块分清楚，不同模块分到不同的				projects				里面，这里面出现了很多问题，也反映了我知识上的很多不足。								1				，				project				最后的输出要设置清楚，有的是				static lib				，有的是				dll				，有的是				ex...&nbsp;&nbsp;<a href='http://www.cppblog.com/jacky2019/archive/2007/03/29/20891.html'>阅读全文</a><img src ="http://www.cppblog.com/jacky2019/aggbug/20891.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">小熊</a> 2007-03-29 19:10 <a href="http://www.cppblog.com/jacky2019/archive/2007/03/29/20891.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++编译选项学习</title><link>http://www.cppblog.com/jacky2019/archive/2007/03/20/20176.html</link><dc:creator>小熊</dc:creator><author>小熊</author><pubDate>Mon, 19 Mar 2007 16:42:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/03/20/20176.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/20176.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/03/20/20176.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/20176.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/20176.html</trackback:ping><description><![CDATA[
		<p class="MsoListParagraph" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt">
				<span lang="EN-US">
						<span>1、</span>
				</span>
				<span style="FONT-FAMILY: 宋体">如何判断是</span>
				<span lang="EN-US">32</span>
				<span style="FONT-FAMILY: 宋体">位的还是</span>
				<span lang="EN-US">64</span>
				<span style="FONT-FAMILY: 宋体">位的</span>
		</p>
		<p class="MsoListParagraph" style="MARGIN-LEFT: 18pt; TEXT-INDENT: 0cm">
				<span lang="EN-US">/* Find the arch type */<br />#if defined(__x86_64__) || defined(_M_X64)<br />#  </span>
				<span style="FONT-FAMILY: 宋体">说明是</span>
				<span lang="EN-US">64</span>
				<span style="FONT-FAMILY: 宋体">位的</span>
				<span lang="EN-US">
						<br />#else<br />#  </span>
				<span style="FONT-FAMILY: 宋体">说明是</span>
				<span lang="EN-US">32</span>
				<span style="FONT-FAMILY: 宋体">位的</span>
		</p>
		<p class="MsoListParagraph" style="MARGIN-LEFT: 18pt; TEXT-INDENT: 0cm">
				<span lang="EN-US">
						<?xml:namespace prefix = o /?>
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoListParagraph" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt">
				<span lang="EN-US">
						<span>2、</span>
				</span>
				<span style="FONT-FAMILY: 宋体">如何判断使用的是什么编译器</span>
		</p>
		<p class="MsoListParagraph" style="MARGIN-LEFT: 18pt; TEXT-INDENT: 0cm">
				<span lang="EN-US">#if defined( _MSC_VER )<br />#   </span>
				<span style="FONT-FAMILY: 宋体">说明是微软的</span>
				<span lang="EN-US">vc</span>
				<span style="FONT-FAMILY: 宋体">编译器</span>
				<span lang="EN-US">
						<br />#elif defined( __GNUC__ )<br />#   </span>
				<span style="FONT-FAMILY: 宋体">说明是</span>
				<span lang="EN-US">GNU</span>
				<span style="FONT-FAMILY: 宋体">的</span>
				<span lang="EN-US">
						<br />#elif defined( __BORLANDC__ )<br />#   </span>
				<span style="FONT-FAMILY: 宋体">说明是</span>
				<span lang="EN-US">borland</span>
				<span style="FONT-FAMILY: 宋体">的</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
<img src ="http://www.cppblog.com/jacky2019/aggbug/20176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">小熊</a> 2007-03-20 00:42 <a href="http://www.cppblog.com/jacky2019/archive/2007/03/20/20176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>再次探讨双分派double dispatch</title><link>http://www.cppblog.com/jacky2019/archive/2007/03/13/19755.html</link><dc:creator>小熊</dc:creator><author>小熊</author><pubDate>Tue, 13 Mar 2007 08:02:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/03/13/19755.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/19755.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/03/13/19755.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/19755.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/19755.html</trackback:ping><description><![CDATA[前几次写了一下关于c++不支持多分派（包括双分派）的问题，应该说是学习了，本人还是个菜鸟啊。<br />发现我自己把多分派给搞复杂了！其实双分派这个概念也是从学visitor模式看到的，其意义在于接受者和参数都能在运行时决定它的类型，但是c++只支持单分派，也就是说参数的类型将在编译阶段决定。所以其实想要演示一下这个问题的话，其实，是非常简单的！如下：<br />///////////////////////////////////////////////////////////////////<br />#include &lt;iostream&gt;<br />using namespace std;<br /><br />class BE;<br /><br />//B<br />class B<br />{<br />public:<br /> void virtual output(B * b){cout &lt;&lt; "B:B" &lt;&lt; endl;}<br /> void virtual output(BE * be){cout &lt;&lt; "B:BE" &lt;&lt; endl;}<br />};<br />class BE : public B<br />{<br />public:<br /> void output(B * b){cout &lt;&lt; "BE:B" &lt;&lt; endl;}<br /> void output(BE * be){cout &lt;&lt; "BE:BE" &lt;&lt; endl;}<br />};<br /><br />int main()<br />{<br />    B * p1 = new BE;<br />    B * p2 = new BE;<br />    p1-&gt;output(p2);<br /> <br /> return 0;<br />}<br />///////////////////////////////////////////////////////////////////<br />如果参数能够在运行时决定类型的话，那么输出来的信息应该是BE:BE，因为p2的实际类型是BE。但是，事实上输出来的结果是BE:B。也就是说p2的类型被误解为B了！这就是问题的所在了。<br />把简单的事情搞复杂了，那真是折腾啊，呵呵。<br />Over。<br /><br /><br /><img src ="http://www.cppblog.com/jacky2019/aggbug/19755.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">小熊</a> 2007-03-13 16:02 <a href="http://www.cppblog.com/jacky2019/archive/2007/03/13/19755.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++只支持单分派(single dispatch) 探讨2</title><link>http://www.cppblog.com/jacky2019/archive/2007/03/13/19704.html</link><dc:creator>小熊</dc:creator><author>小熊</author><pubDate>Tue, 13 Mar 2007 03:36:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/03/13/19704.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/19704.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/03/13/19704.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/19704.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/19704.html</trackback:ping><description><![CDATA[上次写了一下，结果漏洞百出，sigh。不过在高手的批评下，本人再多try了几下，似乎又明白了不少，呵呵。如果有问题，请各位高手不吝赐教。谢谢哈！<br />下面演示了一下c++不支持双分派。一共有四各类，A, AD, B, BE, 其中AD是A的子类，BE是B的子类。他们都有一个叫output的函数（函数名不一定要一样的）。问题出现在哪里呢？问题出现在A或AD类中output函数里的b-&gt;output(a);这个语句。其中b是能够动态track到他自己的类型的，但是a就不行了！因为它已经被静态绑定到A类型了，所以输出结果是：<br />output信息：<br />///////////////////////////////<br />AD:BE<br />BE:A //如果正确的话，这里应该输出BE:AD<br />AD:B<br />B:A  //如果正确的话，这里应该输出B:AD<br /><br />AD:BE<br />BE:A<br />A:B<br />B:A<br /><br />///////////////////////////////<br />现在把接口改成AD*a, 显示出错信息：<br />error: invalid conversion from `A*' to `AD*'<br />///////////////////////////////<br /><br />现在把b-&gt;output(a)改成b-&gt;output(this)，输出结果如下：<br />AD:BE<br />BE:AD<br />AD:B<br />B:AD<br /><br />AD:BE<br />BE:A<br />A:B<br />B:A<br />///////////////////////////////<br />结果就正确了！因为this显然已经指向了正确的类型，而且也没有经过中间步骤地转换，所以其信息还是能够runtime找到的。<br />over。<br /><br />不知上面的解释是否正确，如果有问题，请各位高手赐教了。小弟先谢谢了。<br /><br /><br /><br />代码如下：<br />////////////////////////////////////<br />#include &lt;iostream&gt;<br />#include &lt;list&gt;<br />using namespace std;<br /><br />class A;<br />class AD;<br />//B<br />class B<br />{<br />public:<br /> void virtual output(A * a){cout &lt;&lt; "B:A" &lt;&lt; endl;}<br /> void virtual output(AD * ad){cout &lt;&lt; "B:AD" &lt;&lt; endl;}<br />};<br />class BE : public B<br />{<br />public:<br /> void output(A * a){cout &lt;&lt; "BE:A" &lt;&lt; endl;}<br /> void output(AD * ad){cout &lt;&lt; "BE:AD" &lt;&lt; endl;}<br />};<br /><br />//A<br />class A<br />{<br />public:<br /> void virtual output(B * b, A * a){cout &lt;&lt; "A:B" &lt;&lt; endl;b-&gt;output(a);}<br /> void virtual output(BE * b, A * a){cout &lt;&lt; "A:BE" &lt;&lt; endl;b-&gt;output(a);}<br />};<br />class AD : public A<br />{<br />public:<br /> void output(B * b, A * a){cout &lt;&lt; "AD:B" &lt;&lt; endl;b-&gt;output(a);}<br /> void output(BE * b, A * a){cout &lt;&lt; "AD:BE" &lt;&lt; endl;b-&gt;output(a);}<br />};<br /><br />int main()<br />{<br />    A * pAD = new AD;<br />    pAD-&gt;output(new BE, pAD);<br />    pAD-&gt;output(new B, pAD);<br /><br />cout&lt;&lt;endl;<br /><br />    A * pA = new A;<br />    pA-&gt;output(new BE, pA);<br />    pA-&gt;output(new B, pA);<br /> <br /> return 0;<br />}<br /><br /><img src ="http://www.cppblog.com/jacky2019/aggbug/19704.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">小熊</a> 2007-03-13 11:36 <a href="http://www.cppblog.com/jacky2019/archive/2007/03/13/19704.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++只支持单分派(single dispatch)</title><link>http://www.cppblog.com/jacky2019/archive/2007/03/09/19476.html</link><dc:creator>小熊</dc:creator><author>小熊</author><pubDate>Fri, 09 Mar 2007 02:36:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/03/09/19476.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/19476.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/03/09/19476.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/19476.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/19476.html</trackback:ping><description><![CDATA[
		<div class="sysBr500 text" id="articleText4b419a3f010008sa" align="left">
				<div>第三个版本了！居然有搞错了。原本以为已经理解了多分派，写出来以后才知道问题那么多！所以说要多实践，多和高手讨论讨论阿。<br />如果还有问题，请大家不吝赐教。谢谢哈！<br />#include &lt;iostream&gt;<br />#include &lt;list&gt;<br />using namespace std;<br />//B<br />class B<br />{<br />};<br />class BE : public B<br />{<br />};</div>
				<div>//A<br />class A<br />{<br />public:<br /> void virtual output(B * b){cout &lt;&lt; "A:B" &lt;&lt; endl;}<br /> void virtual output(BE * b){cout &lt;&lt; "A:BE" &lt;&lt; endl;}<br />};<br />class AD : public A<br />{<br />public:<br /> void output(B * b){cout &lt;&lt; "AD:B" &lt;&lt; endl;}<br /> void output(BE * b){cout &lt;&lt; "AD:BE" &lt;&lt; endl;}<br />};</div>
				<div>int main()<br />{<br /> A * pA = new AD;<br /> pA-&gt;output(new BE);<br /> list&lt;B*&gt; * listb = new list&lt;B*&gt;();<br /> listb-&gt;push_back(new BE);<br /> pA-&gt;output(listb-&gt;back());<br /> <br /> return 0;<br />}</div>
				<div>
						<br />////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br /><font color="#ff0000">以下有问题！！</font><br />居然写错了！哈哈。谢谢各位大哥的评论阿。这个代码是我以前写的，我还以为是正确的。。。晕了。哈哈<br />下面的代码是改过以后的，不知道还有没有问题？希望各位多提意见哈<br />#include &lt;iostream&gt;<br />using namespace std;<br />//B<br />class B<br />{<br />public:<br /> virtual void print()<br /> {cout &lt;&lt; "B" &lt;&lt; endl;}<br />};<br />class BE : public B<br />{<br />public:<br /> void print()<br /> {cout &lt;&lt; "BE" &lt;&lt; endl;}<br /> void print(int i)<br /> {cout &lt;&lt; "BE:" &lt;&lt; i &lt;&lt; endl;}<br />};<br /><br />//A<br />class A<br />{<br />public:<br /> void output(int i)<br /> {<br />     B * b = new B;<br />     B * be = new BE;<br />     b-&gt;print();<br />     be-&gt;print();<br />     be-&gt;print(i);//问题出现在这里！！！如改为((BE*)be)-&gt;print(i)就OK了。<br /> }<br />};<br /><br />int main()<br />{<br /> A a;<br /> a.output(99);<br /> <br /> return 0;<br />}<br /><br />--------------------Configuration: test - Debug--------------------<br />Compiling source file(s)...<br />test.cpp<br />test.cpp: In member function `void A::output(int)':<br />test.cpp:29: error: no matching function for call to `B::print(int&amp;)'<br />test.cpp:8: note: candidates are: virtual void B::print()<br /><br />test.exe - 2 error(s), 0 warning(s)<br /><br /><br /><br /><br />//////////////////////////////////////////////////////////////////////////////////////////////////////<br /><font color="#ff0000">以下代码有问题！</font><br /></div>
				<div>////////////////////////////////////////////////////////////////////////////////////////////////////// <br /></div>
				<div>c++不支持双分派(double dispatch)和多分派(multi-dispatch)，只支持单分派(single dispatch)。一个典型的不支持双分派的例子如下所示：<br />#include &lt;iostream&gt;<br />using namespace std;</div>
				<div>class B<br />{<br />public:<br /> virtual void print()<br /> {cout &lt;&lt; "c" &lt;&lt; endl;}<br />};</div>
				<div>class E1 : public B<br />{<br />public:<br /> void print()<br /> {cout &lt;&lt; "E1" &lt;&lt; endl;}</div>
				<div>};</div>
				<div>class E2 : public B<br />{<br />public:<br /> void print()<br /> {cout &lt;&lt; "E2" &lt;&lt; endl;}</div>
				<div>};</div>
				<div>class A<br />{<br />public:<br /> virtual void output(B* p)<br /> {cout &lt;&lt; "A" &lt;&lt; endl;p-&gt;print();}<br />};</div>
				<div>class D1 : public A<br />{<br />public:<br /> void output(B* p)<br /> {cout &lt;&lt; "D1" &lt;&lt; endl;p-&gt;print();}<br />};</div>
				<div>class D2 : public A<br />{<br />public:<br /> void output(B* p)<br /> {cout &lt;&lt; "D2" &lt;&lt; endl;p-&gt;print();}<br />};</div>
				<div>void f(A* p, B* q)<br />{<br /> p-&gt;output(q);<br />}</div>
				<div>int main()<br />{<br /> A * pd1 = new D1;<br /> B * pe1 = new E1;<br /> <br /> f(pd1, pe1);<br /> <br /> end:<br /> int end;<br /> cin &gt;&gt; end;<br /> return 0;<br />}</div>
		</div>
<img src ="http://www.cppblog.com/jacky2019/aggbug/19476.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">小熊</a> 2007-03-09 10:36 <a href="http://www.cppblog.com/jacky2019/archive/2007/03/09/19476.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>